Подтвердить что ты не робот

Entity Framework 4.1 Код Первый идентификатор внешнего ключа

У меня есть два объекта, на которые ссылаются одни. Когда структура сущности создала таблицу, она создает два внешних ключа, один для ключа, который я указал с помощью свободного интерфейса, а другой для ICollection. Как избавиться от дублированного внешнего ключа?

public class Person
{
    public long RecordId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Username { get; set; }

    public long DepartmentId { get; set; }
    public virtual Department Department { get; set; }
}

public class Department
{
    public long RecordId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Person> People { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
        .HasRequired(p => p.Department)
        .WithMany()
        .HasForeignKey(p => p.DepartmentId)
        .WillCascadeOnDelete(false);
}

Спасибо!

4b9b3361

Ответ 1

Вы должны явно указать многоконтактную связь:

modelBuilder.Entity<Person>()
    .HasRequired(p => p.Department)
    .WithMany(d => d.People)
    .HasForeignKey(p => p.DepartmentId)
    .WillCascadeOnDelete(false);

В противном случае EF предположит, что существуют две ассоциации: одна, которая не отображается в Department с внешним ключом DepartmentId и навигационным свойством Department в классе Person, как вы определили в коде Fluent - и другая ассоциация, которая относится к открытому навигационному свойству People, но с другим незакрытым концом в Person и внешним ключом, автоматически созданным EF. Это другой ключ, который вы видите в базе данных.

Ответ 2

Стандартные соглашения Code First определяют ваш внешний ключ DepartmentId, поскольку он, как правило, является обычным. Я думаю, вы должны удалить определение Fluent:

modelBuilder.Entity<Person>()
    .HasRequired(p => p.Department)
    .WithMany()
    .WillCascadeOnDelete(false);

Ответ 3

Лучше всего удалить свойство departmentid из класса Person и добавить следующий оператор. MapKey создаст столбец внешнего ключа с указанным вами именем.

 modelBuilder.Entity<Person>().HasRequired(p =>  p.Department)
    .WithMany().Map(x=>x.MapKey("DepartmentId"))
    .WillCascadeOnDelete(false);