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);
}
Спасибо!
Ответы
Ответ 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);