Да, вам нужно объявить, что родительский элемент может иметь значение NULL.
Если вы предоставляете свойство внешнего ключа для дочернего элемента, оно должно иметь значение NULL.Поэтому, если у вашего ребенка есть свойство ParentId, оно должно выглядеть следующим образом:
public int? ParentId { get; set; }
public virtual Parent { get; set; }
Если вы используете свободный API, вы можете сказать EF, что родительский элемент обнуляется следующим образом:
modelBuilder.Entity<Child>.HasOptional(d => d.Parent).WithMany(p => p.Children);
Или вот так, если вы объявляете связь с основного конца, а не с зависимого конца:
modelBuilder.Entity<Parent>.HasMany(p => p.Children).WithOptional(d => d.Parent);
Странно, что child.Parent должен быть дважды установлен в null.Вы пытались войти в код, чтобы понять, почему?Вы также можете попробовать это для своего свойства Parent, чтобы точно увидеть, что происходит:
private Parent _parent;
public virtual Parent
{
get { return _parent; }
set { _parent = value; }
}
Это код, который вы можете использовать, чтобы убедиться, что для частного поля установлено значение null.
Ответ на комментарий
Звучит так, будто существует проблема с отложенной загрузкой.Попробуйте это.
В вашем методе поиска в хранилище, стремясь загрузить родителя.Вы можете сделать это примерно так:
context.Children.Include(c => c.Parent).Find(id);
Это сделает child.Parent уже загруженным в контекст, и однократной установки на ноль должно быть достаточно.