【问题标题】:Workaround for breezejs not supporting cascade delete?微风不支持级联删除的解决方法?
【发布时间】:2013-07-24 11:09:06
【问题描述】:

这让我很头疼,直到我从这个link 中发现了breezejs 还不支持级联删除。我试图通过直接向数据库表添加级联删除约束来解决此限制。但是,它似乎也不适用于微风(如果我手动删除父行,它会起作用)。根据我的观察,当微风删除父行时,它将子行的外键设置为空。有什么想法吗?

顺便说一句,为了避免删除时微风抛出异常,我必须使外键可以为空。我还必须关闭实体框架上的级联删除。

【问题讨论】:

    标签: entity-framework breeze cascade cascading-deletes


    【解决方案1】:

    我知道这个问题已经有几个月的历史了,但是我在寻找解决方案时偶然发现了这个问题太多次,因此它可能会对某人有所帮助。这是我设法完成的一种解决方法(未经过彻底测试,但它适用于最初的几次测试)。

    假设我有一个父类Parent 和一个子类Child。只有 Parent 存在,Child 才能存在。

    在 Context 类(您放置 protected override void OnModelCreating(DbModelBuilder modelBuilder) 函数的那个​​)中,您编写以下内容:

    public override int SaveChanges(){
      foreach (var entry in this.ChangeTracker.Entries().Where((e => (e.State == (EntityState)Breeze.WebApi.EntityState.Deleted))))
        {
          if (entry.EntityType.GetType() == typeof(Parent)){
            var entity = entry.Entity as Parent;
            var allChildren = Children.Where(p => p.ParentId == entity.Id);
            foreach (var singleChild in allChildren){
              Children.Remove(singleChild);
            }
          }
        }
      }
      return base.SaveChanges();
    }
    

    缺点是 - 您需要为通常会发生级联的每个删除编写此内容。另外,请记住,如果您将 Toy 类的父类 Child 放在一边,您也必须手动处理该类。

    【讨论】:

    • 我试过你的代码,奇怪的是,我的覆盖 SaveChanges 根本没有受到影响。然后,我在存储库的 BeforeSaveEntity() 中尝试了类似的代码,但我仍然收到类似Saving or accepting changes failed because more than one entity of type 'xxx' have the same primary key value. Ensure that explicitly set primary key values are unique. ... Use the Entity Designer for Database First/Model First configuration. Use the 'HasDatabaseGeneratedOption" fluent API or 'DatabaseGeneratedAttribute' for Code First configuration. 的错误。如果我在删除时打开/关闭级联似乎并不重要。
    • 其实你的孩子是什么?我猜应该是entity.Children吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2019-09-22
    • 1970-01-01
    • 2023-02-20
    • 2021-03-17
    • 2010-12-07
    • 2014-12-13
    相关资源
    最近更新 更多