Проблемы моделирования отношений в Entity Framework с использованием кода в первую очередь - PullRequest
8 голосов
/ 12 июня 2011

Я пытаюсь сначала изучить код в Entity Framework, и у меня возникают проблемы при моделировании отношений. Это базовая база данных по кадрам, в которой есть две организации: сотрудники и отделы.

Сотрудник принадлежит к отделу, а в отделе есть администратор группы и менеджер, оба из которых являются действующими сотрудниками. Я попытался смоделировать это, используя следующее:

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

Очевидно, я хотел бы, чтобы таблица Department имела только четыре столбца - DepartmentID, Description, ManagerID и TeamAdministratorID, но она генерирует дополнительные два для отношения, а именно Manager_EmployeeID и Team_Administrator_EmployeeID. Кроме того, в таблице Employee создается столбец Department_DepartmentID для хранения вместо него идентификатора DepartmentID с использованием столбца DepartmentID, указанного в сущности.

Что я делаю не так? Как мне определить поля и отношения, чтобы код сначала не игнорировал то, что я указал, и генерировал собственные поля навигации в базе данных?

Ответы [ 2 ]

7 голосов
/ 12 июня 2011

Это потому, что конфигурация вашей модели неполна - вы начали свое собственное отображение с Fluent API, поэтому вы должны сказать EF, что эти свойства действительно являются FK для отношений. Для использования сотрудником:

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

А для использования в отделе:

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

Btw. без навигационных свойств коллекции на противоположной стороне отношений будет сложно использовать модель (все WithMany пусты). По крайней мере Department должно иметь:

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

И отображение должно быть изменено на:

modelBuilder.Entity<Employee>()
            .HasOptional(x => x.Department)
            .WithMany(y => y.Employees)
            .HasForeignKey(x => x.DepartmentID);
0 голосов
/ 12 июня 2011

См. Ваш класс сотрудников

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

Чтобы показать отношения между сотрудником и отделом, вы использовали ID и Отдел.В действительности вам нужно сделать это только один раз - через Department.EF по умолчанию ищет свойство ID и связывает два класса для вас.Таким образом, ваши классы должны включать только один идентификатор - идентификатор самого класса.Попробуйте удалить идентификаторы для других классов.

...