Ответ 1
Вы должны настроить его с другой стороны ассоциации:
modelBuilder.Entity<ParentEntity>()
.HasMany(p => p.Children)
.WithRequired()
.HasForeignKey(c => c.ParentEntityId)
.WillCascadeOnDelete(false);
Скажем, у меня есть эти две очень простые сущности:
public class ParentEntity
{
public int Id;
public virtual ICollection<ChildEntity> Childrens;
}
public class ChildEntity
{
public int Id;
public int ParentEntityId; // Foreign Key
public virtual ParentEntity parent; // [NOTWANTED]
}
По некоторым причинам я не хочу, чтобы ChildEntity сохранял ссылку на родителя. Я просто хочу, чтобы он сохранял идентификатор ParentEntity, но не более того. До сих пор, без проблем, я просто удаляю строку [NOTWANTED], и все работает так, как ожидалось.
Моя проблема: как отключить каскадное удаление в этом конкретном случае?
Если у меня все еще было свойство родительской навигации, это было бы так же просто, как:
modelBuilder.Entity<ChildEntity>()
.HasRequired(c => c.parent)
.WithMany(p => p.Childrens)
.WillCascadeOndelete(false)
Однако без свойства навигации я понятия не имею, как я могу добиться, чтобы отключить каскад при удалении (не отключая его глобально, конечно, ни за таблицу, а только для отношения).
То, что я сделал прямо сейчас, это установить внешний ключ как nullable int, чтобы отключить каскад при удалении, но это не так:
public int? ParentEntityId; // Foreign Key - nullable just to disable cascade on delete
Как я могу заставить его работать с белым API? Думайте, что это должно быть возможно.
Вы должны настроить его с другой стороны ассоциации:
modelBuilder.Entity<ParentEntity>()
.HasMany(p => p.Children)
.WithRequired()
.HasForeignKey(c => c.ParentEntityId)
.WillCascadeOnDelete(false);