Когда вы добавляете экземпляр Container
в контекст, процесс исправления отношений EF Core проверит коллекцию Items
и автоматически назначит свойство Item.Container
(и FK).Тем не менее, элементы более низкого уровня, которые не содержатся в коллекции Items
и не имеют назначенного свойства Container
, поэтому EF будет пытаться использовать любое значение, содержащееся в FK (поскольку оно не может быть пустым, оно будет использовать 0
- обратите внимание, что 0
является допустимым значением для не сгенерированного ключа).
Если вам интересно, почему он не присваивает верхний Container
рекурсивно, ответ - потому что модель не предполагает такого поведения.С реляционной точки зрения нет никакой связи между ParentItem.Container
и ChildItem.Container
- вполне допустимо, чтобы они имели разные значения.Если предполагается, что все дочерние элементы совместно используют контейнер корневых элементов, тогда модель сущности содержит избыточность - Container
свойство / FK должно иметь значение NULL и назначаться только для корневых элементов (в основном взаимоисключающих с ParentItem
).
Если вы хотите оставить все как есть, вы не сможете выразить свое намерение EF Core (или реляционной базе данных в целом).Таким образом, вам нужно применить это ограничение вручную, либо добавив элементы нижнего уровня в коллекцию контейнера Items
, либо проще - назначьте экземпляр контейнера их свойству Container
:
var container = new Container();
container.Items = new List<ContainerItem>
{
new ContainerItem
{
ChildItems = new List<ContainerItem>
{
new ContainerItem
{
Container = container // <-- do the same for all non direct items
}
}
}
};