![](/img/trans.png)
[英]ASP.NET Core Entity Framework relationship issue - Why no cascade delete and migration issue
[英]Understanding cascade delete in a specific relationship in .net mvc (entity framework)?
如果我在使用实体框架(具有模型等的数据库上下文中的dbset)的.NET MVC项目中具有这样的关系。
class A {
contains a list of class C objects (one-to-many)
}
class B {
contains a list of class C objects (one-to-many), often many of the
same class C entries which class A uses aswell
}
class C {
contains class D elements
}
class D { }
所以主要的问题是,类A是我想经常删除的模型,因为它中的数据只应存在固定的时间(然后由cron作业删除),但是由于某种原因,当我删除它时A类条目似乎弄乱了C类和D类之间的关系,从而从数据库中的C类条目中删除了D类项目。
有什么方法可以删除我的类A数据库表中的条目,同时确保它完全无一例外地将所有其他表都保留下来?
我已经阅读了禁用级联删除的内容,但是老实说,我对如何理解这种特殊情况下发生的奇怪关系感到困惑,并且我不确定应该禁用什么。
我希望这个例子有意义,我已经尝试过尽可能简单地解释它。
默认情况下,EF启用了OneToManyCascadeDeleteConvention
。 就像通过在表之间的外键上设置SQL级联删除操作一样。 当删除主要对象时,任何外键指向该对象的对象也将被删除。 因此,在您的示例中,当删除A
它还将删除集合中的所有C
对象。 并且由于我们级联,它还将删除所有C
对象集合中的所有D
对象(假设您的意思是C
包含一对多的D
对象集合)。
但是,仅在将外键字段设置为必需时,才应用OneToManyCascadeDeleteConvention
。 将其设置为可为空(如下面的示例所示)应禁用约定。
public class ObjectA
{
public int ObjectAId { get; set; }
public virtual ICollection<ObjectC> ObjectCCollection { get; set; }
}
public class ObjectC
{
public int? ObjectAId { get; set; }
public virtual ObjectA ObjectA { get; set; }
}
话虽如此,您还可以在使用实体类型配置EntityTypeConfiguration
配置期间有选择地删除ObjectA
到ObjectC
之间的级联。
internal class ObjectCMap : EntityTypeConfiguration<ObjectC>
{
public ObjectCMap()
{
this.HasOptional(o => o.ObjectA).WithMany(o => o.ObjectCCollection).WillCascadeOnDelete(false);
}
}
然后在DbContext
向模型构建器注册
modelBuilder.Configurations.Add(new ObjectCMap());
但是,如果ObjectC
上的外键字段不可为空,则当您尝试删除ObjectA
时,SQL将引发外键错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.