www.IT-Visions.de-Diskussionsforen (Version 2.1)
(Diese Seite wurde noch nicht auf das neue Layout umgestellt!)


Diese Foren stehen den Lesern unserer Bücher und allen anderen registrieren Benutzern dieser Website zur Verfügung. Wir würden uns freuen, wenn viele Nutzer dieser Website hier nicht nur Fragen stellen, sondern auch die Fragen anderer Nutzer beantworten. Diese Foren sind ein ehrenamtlicher, nicht-kommerzieller, unmoderierter Community-Dienst von www.IT-Visions.de. Wenn Sie kommerzielle Unterstützung für .NET/Scripting/PowerShell suchen, schauen Sie bitte auf unser Support-Angebot und unsere Schulungsangebote für Scripting und Schulungsangebote für .NET.



Re: MVC-Entity Framework 6-Repository-ManyToMany
Autor:  RobShot
E-mail:  Antworten bitte nur in das Forum!
Datum:  05.10.2017 13:23:20
Subject:  Re: MVC-Entity Framework 6-Repository-ManyToMany
Bezug zum Buch: 
Message:  Meine Nachricht:
----------------
Hallo zusammen,

ich konnte das Problem selbst beheben, also Beitrag ist erledigt.
Das Problem lag am Datenbankcontext der für jedes Repository im DocumentController / Konstruktor mit new neu erstellt wurde, siehe:

_DocumentRepository = new DocumentRepository(new Models.DocumentContext());

_EmployeeRepository= new EmployeeRepository(new Models.DocumentContext());

_CompanyRepository= new CompanyRepository(new Models.DocumentContext());

//geändert auf:
Models.DatabaseContext context = new DatabaseContext();
            
            _DocumentRepository = new DocumentRepository(context);
            _EmployeeRepository = new EmployeeRepository(context);
            _CompanyRepository = new CompanyRepository(context);

Gruß

Rob


Ich beziehe mich auf folgenden Beitrag:
---------------------------------------

Hallo zusammen,

ich bin neu hier und auch neu bei der MVC - Programmierung inklusive des EF 6.

Ich habe ein kleines Problem bei der Speicherung von einer Many to Many - Beziehung. Ich möchte gerne ein Dokument speichern, dass für selektierte Mitarbeiter freigegeben wird. Insgesamt funktioniert das ganze schon aber …😊
Mein Problem ist wenn ich die Beziehung zwischen „Document“ und „Employee“ herstelle, wird das Dokument gespeichert und zusätzlich werden auch die schon vorhandenen selektierten „Employees“ neu hinzugefügt. Wie kann ich das am besten verhindern? Wie kann ich zwar ein neues Dokument erstellen und zusätzlich nur die Beziehung zu schon vorhandenen Objekten herstellen?
Ein paar Details mehr:
Ich benutze das Entity Framework 6 das ich über ein Repository fülle und abfrage. Im DocumentController erstelle ich dann die Verknüpfung zum Repository über ein Interface, siehe meine Klassen:
Model:
[Table("Document")]
    public class Document
    {
        private int docID;
        private string docName;
        private int EmployeeId;
        private ICollection<Employee> releasedEmployees;


        public Document()
        {
            this.Employees = new HashSet<Employee>();
        }

        [Key]
        public int DocumentID
        {
            get { return docID; }
            set { docID = value; }
        }

        public string Name
        {
            get { return docName; }
            set { docName = value; }
        }


        //Owner of document, ID saved in Database
        public int EmployeeID
        {
            get { return EmployeeId; }
            set { EmployeeId = value; }
        }

        [NotMapped]
        public int[] SelectedEmployees { get; set; }


        public virtual ICollection<Employee> Employees
        {
            get { return releasedEmployees; }
            set { releasedEmployees = value; }
        }
}

[Table("Employee")]
    public class Employee
    {
        private int EId;
        private string EName;
        private ICollection<Document> documents;


        public Employee()
        {
            this.Document = new HashSet<Document>();
        }

        [Key]
        public int EmployeeID
        {
            get { return EId; }
            set { EId = value; }
        }

        [Display(Name = "Employee Name")]
        [Required(ErrorMessage = "Name is required")]
        public string EmployeeName
        {
            get { return EName; }
            set { EName = value; }
        }

        public virtual ICollection<Document> Document
        {
            get { return documents; }
            set { documents = value; }
        }
//Methode aus Document Repository:
       public int AddDocument(Document DocumentEntity)
        {
            int result = -1;

            if (DocumentEntity != null)
            {
               _context.Documents.Add(DocumentEntity);
               _context.SaveChanges();
               result = DocumentEntity.DocumentID;
            }

            return result;
        }

//Document Controller:

[HttpPost]
        public ActionResult AddDocument(Document model, HttpPostedFileBase upload)
        {
ViewData["RelaesedEmployees"] = new MultiSelectList(modelEmp, "EmployeeID", "EmployeeName", model.SelectedEmployees);


            if (ModelState.IsValid)
            {
               }
             //Selectierte Benutzer aus Multiselectbox
               foreach (var item in model.SelectedEmployees)
               {
                    model.Employees.Add(_EmployeeRepository.GetEmployeeById(item));
               }

               _EmployeeRepository.Dispose();

               int result = _DocumentRepository.AddDocument(model);

               if (result > 0)
               {
                    return RedirectToAction("Index", "Document");
               }
               else
               {
                    TempData["Failed"] = "Failed";
                    return RedirectToAction("AddDocument", "Document");
               }
     }

//Database Context:
public class DatabaseContext: DbContext
    {
        public DatabaseContext(): base("TEST")
        {
           
        }

        public DbSet<Employee> Employees
        {
            get;
            set;
        }

        public DbSet<Document> Documents
        {
            get;
            set;
        }

        //FluentAPi:
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            // modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            modelBuilder.Entity<Document>()
            .HasMany(c => c.Employees)
            .WithMany(i => i.Document)
            .Map(
               t =>
               {
                    t.MapLeftKey("DocumentID");
                    t.MapRightKey("EmployeeID");
                    t.ToTable("DocumentEmployees");
               });
        }


Ich habe schon ausprobiert das ich zuerst das Dokument mit „int result = _DocumentRepository.AddDocument(model)“ angelegt habe und danach versucht habe das Dokument upzudaten „int result = _DocumentRepository.UpdateDocument(model);“ mit der Beziehung, in dem Fall wird nur das Dokument gespeichert aber nicht die Beziehung in der 3. Tabelle „DocumentEmployees“ zu Employees.
So richtig fit bin ich mit MVC und dem EntityFramework noch nicht, wahrscheinlich ist das für Profis nur ein Kinderspiel &#128522;.
Danke Euch jetzt schon im Voraus.

Gruß
Rob

Antworten

  Zurück zum Forum



 .NET Framework-Programmierung -- C#, VB.NET, ASP.NET, u.a.
 MVC-Entity Framework 6-Repository-ManyToMany von RobShot  am 1.10.2017 7:22:08 PM
 Re: MVC-Entity Framework 6-Repository-ManyToMany von RobShot  am 5.10.2017 1:23:20 PM
 Re: MVC-Entity Framework 6-Repository-ManyToMany von RobShot  am 5.10.2017 1:23:07 PM


www.IT-Visions.de - Dr. Holger Schwichtenberg / 1998-2019