ASP.NET Zone

Die ASP.NET Community. Alle Antworten rund um Microsoft® Webtechnologien
Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe | Impressum | ASP.NET Zone Suchplugin

in
Home Blogs Foren FAQ Communities Fotos Downloads

Entityframework 6 - Many to Many - Repository

Letzter Beitrag 10-05-2017, 13:22 von RobShot. 1 Antworten.
Beiträge sortieren: Zurück Weiter
  •  10-01-2017, 14:52 226050

    Entityframework 6 - Many to Many - Repository

    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 releasedEmployees;


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

    [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 Employees
    {
    get { return releasedEmployees; }
    set { releasedEmployees = value; }
    }
    }

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


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

    [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
    {
    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 Employees
    {
    get;
    set;
    }

    public DbSet Documents
    {
    get;
    set;
    }

    //FluentAPi:
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    // modelBuilder.Conventions.Remove();
    modelBuilder.Entity()
    .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 😊.
    Danke Euch jetzt schon im Voraus.

    Gruß
    Rob



    Abgelegt unter: , , ,
  •  10-05-2017, 13:22 226052 Antwort zu 226050

    AW: Entityframework 6 - Many to Many - Repository

    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
    Abgelegt unter: , ,
Als RSS Feed in XML ansehen
Powered by Community Server (Commercial Edition)