繁体   English   中英

了解.net mvc(实体框架)中特定关系的级联删除?

[英]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配置期间有选择地删除ObjectAObjectC之间的级联。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM