@Fly3110
web developer

Как верно работать с child-parent отношениеями в Entity Framework 6?

есть Parent и Child one-to-one

public class Parent
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int? Id { get; set; }

        public Child Child { get; set; }
}

public class Child
{
        [Key, ForeignKey("Parent")]
        public int ParentId { get; set; }
        
        public virtual Parent Parent{ get; set; }
}


если я создаю объект parent (пока не сохраняя его в базу) и в него прописываю child и сохраняю, то все ок.
Но при этом я не могу работать с отношением child->parent, так как там null

var parent = new Parent();
var child = new Child();

parent.Child = child;

// child.Parent = parent; // Если раскомментировать, будет ошибка: Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values

using (var appDbContext = new AppDbContext()) {
    appDbContext .Parents.AddOrUpdate(parent);
    appDbContext .SaveChanges();
}


если я создаю parent, в него добавляю child и в этого child добавляю этого же parent (выше), то при сохранении вылезает ошибка.
Логично потому что получается parent->child->этот же parent, который потом указывает на этот же child итд итп.
(сохраняю в абсолютно пустую базу, так что конфликтов с какими-то существующими сущностями быть не может)

Но мне очень удобно работать с отношением child.Parent в коде.
Какое для такой ситуации есть решение?

Я вижу 2 решения (оба не особо нравятся):
1. Везде, где мне надо работать с полями родителя, передавать этого родителя явно, а не использовать отношение child.Parent. Вроде по логике кажется, что так и надо, но не хочется много переписывать :)
2. Перед сохранением пробегать по всему дереву детей и чистить родителей (в вопросе очень упрощенный пример, в реальности там не одно и не два поля и 4 уровня вложенности). Но это совсем костыль уже.
  • Вопрос задан
  • 37 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы