есть 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 уровня вложенности). Но это совсем костыль уже.