【问题标题】:How to solve multiple cascade paths with entity code first如何先用实体代码解决多级联路径
【发布时间】:2015-04-29 04:17:28
【问题描述】:

Template 可以有零个或多个Document 和零个或多个MetaIndexDocument 可以有零个或多个IndexMetaIndex 也可以有零个或多个Index

这代表潜在的级联问题,因为删除Template 将删除其Document(没关系);删除Document 将删除其Index,这也可以。但是当删除Template 尝试删除MetaIndex(这也会删除Index)时会出现问题(一个循环)。

我理解这个问题。我认为解决它的一种方法是指定当我删除模板时,它的文档及其文档的索引被删除,以及与模板关联的元索引。但是元数据不会级联删除它的关联索引,因此不会出现循环。

在这里搜索potential solution,我试过这个:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<MetaIndex>().HasMany<Index>(m => m.IndicesEnteros).WithRequired().WillCascadeOnDelete(false);
}

但它不起作用:

在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束。查看以前的错误。

【问题讨论】:

  • 在我看来,您在指定 WithRequired() 时尝试设置约束,但随后将级联设置为 false。如果您删除了一个从属元素 db 将不会更新另一个元素并且将违反约束。为了解决这个问题,请尝试启用级联。
  • @GustavoSuarez,级联正是我想要删除的。无论我是否改用 WithOptional(),行为都是一样的。

标签: c# entity-framework-6 ef-fluent-api


【解决方案1】:

最后,在reading and re-reading the docs 之后,我能够让它工作,但了解属性的顺序。我发布了我自己的解决方案,以防它可以帮助其他人。

索引具有必需的元索引(因为它是不可为空的,如果是,则不会创建级联删除)。接下来是指定它是如何导航的(WithMany,MetaIndex 类的集合属性是 Indices)。最后我需要指定外键字段的名称,即(遵循标准)MetaIndexID。然后我可以指定我不需要级联删除。因此,使用级联删除索引的唯一方法是通过文档删除(我想要的)。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Entity<Index>()
        .HasRequired(index => index.MetaIndex)
        .WithMany(metaIndex => metaIndex.Indices)
        .HasForeignKey(index => index.MetaIndexID)
        .WillCascadeOnDelete(false);

    base.OnModelCreating(modelBuilder);
}

【讨论】:

    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 2018-08-03
    • 2021-10-17
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多