Entity Framework 4.1 Идентификаторы первого внешнего ключа кода - PullRequest
19 голосов
/ 14 апреля 2011

У меня есть два объекта, на которые ссылаются один ко многим.Когда инфраструктура сущностей создала таблицу, она создает два внешних ключа: один для ключа, который я указал для свободного интерфейса, а другой для 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);
}

Спасибо!

Ответы [ 3 ]

26 голосов
/ 14 апреля 2011

Вы должны явно указать множество концов ассоциации:

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.Это другой ключ, который вы видите в базе данных.

6 голосов
/ 14 апреля 2011

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

modelBuilder.Entity<Person>()
    .HasRequired(p => p.Department)
    .WithMany()
    .WillCascadeOnDelete(false);
3 голосов
/ 18 декабря 2012

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

 modelBuilder.Entity<Person>().HasRequired(p =>  p.Department)
    .WithMany().Map(x=>x.MapKey("DepartmentId"))
    .WillCascadeOnDelete(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...