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] Атрибут требует свойства навигации в зависимой сущности, в которой находится свойство внешнего ключа.

Другие вопросы по тегам