Frage Problemmodellierungsbeziehung in Entity Framework mithilfe von Code zuerst


Ich versuche Code zuerst innerhalb des Entity Framework zu lernen und habe Probleme beim Modellieren einer Beziehung. Es ist eine Basis-HR-Datenbank, die zwei Entitäten, Mitarbeiter und Abteilungen, hat.

Der Mitarbeiter gehört zu einer Abteilung und die Abteilung hat einen Teamadministrator und einen Manager, die beide tatsächlich Mitarbeiter sind. Ich habe versucht, dies mit dem folgenden Modell zu modellieren:

EMPLOYEE

public int? DepartmentID { get; set; }
public virtual Department Department { get; set; }

Context:

modelBuilder.Entity<Employee>().HasOptional(x => x.Department);

DEPARTMENT

public class Department
{
    [Required]
    public int DepartmentID { get; set; }

    [Required(ErrorMessage = "The description is required.")]
    public string Description { get; set; }

    public int? ManagerID { get; set; }
    public virtual Employee Manager { get; set; }

    public int? TeamAdministratorID { get; set; }
    public virtual Employee TeamAdministrator { get; set; }
}

Context:

modelBuilder.Entity<Department>().HasOptional(x => x.Manager);
modelBuilder.Entity<Department>().HasOptional(x => x.TeamAdministrator);

Offensichtlich möchte ich, dass die Abteilungs-Tabelle nur vier Spalten hat - DepartmentID, Description, ManagerID und TeamAdministratorID, aber es erzeugt zwei extra für die Beziehung, nämlich Manager_EmployeeID und Team_Administrator_EmployeeID. Außerdem wird in der Employee-Tabelle die Spalte Department_DepartmentID generiert, um die DepartmentID zu speichern, anstatt die Spalte DepartmentI zu verwenden, die in der Entität angegeben wurde.

Was mache ich falsch? Wie muss ich die Felder und Beziehungen definieren, um zu vermeiden, dass Code zuerst ignoriert, was ich spezifiziere, und eigene Navigationsfelder in der Datenbank erzeugen?


8
2018-06-12 12:43


Ursprung


Antworten:


Da Ihre Modellkonfiguration unvollständig ist, haben Sie Ihr eigenes Mapping mit der Fluent-API gestartet, sodass Sie EF mitteilen müssen, dass diese Eigenschaften tatsächlich FKs für Relationen sind. Für Mitarbeiter verwenden:

modelBuilder.Entity<Employee>()
            .HasOptional(x => x.Department)
            .WithMany()
            .HasForeignKey(x => x.DepartmentID);

Und für die Nutzung der Abteilung:

modelBuilder.Entity<Department>()
            .HasOptional(x => x.Manager)
            .WithMany()
            .HasForeignKey(x => x.ManagerID);
modelBuilder.Entity<Department>()
            .HasOptional(x => x.TeamAdministrator);
            .WithMany()
            .HasForeignKey(x => x.TeamAdministratorID);

Übrigens. ohne Sammlung Navigationseigenschaften auf der gegenüberliegenden Seite der Beziehungen wird es schwierig sein, Modell zu verwenden (alle WithMany sind leer). Mindestens Department sollte haben:

public virtual ICollection<Employee> Employees { get; set;}

Und Mapping sollte geändert werden, um:

modelBuilder.Entity<Employee>()
            .HasOptional(x => x.Department)
            .WithMany(y => y.Employees)
            .HasForeignKey(x => x.DepartmentID);

7
2018-06-12 13:37



Sehen Sie Ihre Mitarbeiterklasse

EMPLOYEE    
public int? DepartmentID { get; set; }
public virtual Department Department { get; set; }

Um die Beziehung zwischen einem Mitarbeiter und einer Abteilung anzuzeigen, haben Sie ID verwendet und Abteilung. In der Realität müssen Sie das nur einmal tun - via Department. EF sucht standardmäßig nach der ID-Eigenschaft und verknüpft zwei Klassen für Sie. Ihre Klassen sollten also nur eine ID - ID der Klasse selbst enthalten. Versuchen Sie, IDs zu den anderen Klassen zu entfernen.


0
2018-06-12 13:25