EF Внешние ключи "один ко многим" без дочерних навигационных свойств
Используя Entity Framework, основанный на коде, и.NET 4, я пытаюсь создать отношения один-ко-многим между родителями и детьми:
public class Parent
{
[Key]
public int ParentId { get; set; }
[Required]
public string ParentName { get; set; }
public IEnumerable<Child> Children { get; set; }
}
public class Child
{
[Key]
public int ChildId { get; set; }
[ForeignKey]
public int ParentId { get; set; }
[Required]
public string ChildName { get; set; }
}
Как указано здесь, для того, чтобы отношение внешнего ключа передавалось в базу данных, должны быть связаны фактические объекты, а не только их идентификаторы. Обычный способ сделать это, если дочерний элемент содержит ссылку на своего родителя ( пример).
Но как мне применить внешние ключи в моей реализации, как наоборот (родительские ссылки на детей)?
1 ответ
Прежде всего: вы не можете использовать IEnumerable<T>
для свойства навигации коллекции. EF просто проигнорирует это свойство. использование ICollection<T>
вместо.
Когда вы изменили это, в вашем конкретном примере вам не нужно ничего делать, потому что имя свойства внешнего ключа соответствует соглашению (имя первичного ключа ParentId
в основной организации Parent
) так что EF обнаружит требуемое отношение один ко многим между Parent
а также Child
автоматически.
Если у вас есть другое "нетрадиционное" имя свойства FK, вы все равно можете определить такое отображение с помощью Fluent API, например:
public class Child
{
[Key]
public int ChildId { get; set; }
public int SomeOtherId { get; set; }
[Required]
public string ChildName { get; set; }
}
Отображение:
modelBuilder.Entity<Parent>()
.HasMany(p => p.Children)
.WithRequired()
.HasForeignKey(c => c.SomeOtherId);
Насколько я могу судить, это отношение невозможно определить с помощью аннотаций данных. Использование [ForeignKey]
Атрибут требует свойства навигации в зависимой сущности, в которой находится свойство внешнего ключа.