当前位置: 首页 > 知识库问答 >
问题:

引入FOREIGN KEY可能会导致循环或多个级联路径

冀俊良
2023-03-14

我正在使用实体框架和代码优先的方法。

在我的onModelCreating中,我使用键和关系创建表(我使用的是Fluent-API方法,而不是数据注释)。

但当我尝试使用更新数据库命令生成模型时,我收到以下错误

引入外键约束的FK\U客户。发票\客户。表“发票”上的billingCenters_billingCenterId可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他外键约束。无法创建约束。请参阅以前的错误。

我几乎可以肯定我没有周期。。。如果我有级联路径,我就不会有问题。这是我想要的!

遵循我正在创建的模型:

modelBuilder.Entity<Customer>()
    .ToTable("customers", schemaName)
    .HasKey(c => new { c.Code });

modelBuilder.Entity<BillingCenter>()
    .ToTable("billingCenters", schemaName)
    .HasKey(bc => new { bc.Id });

//1 Customer -> N BillingCenters
modelBuilder.Entity<BillingCenter>()
    .HasRequired(bc => bc.Customer)
    .WithMany(c => c.BillingCenters)
    .HasForeignKey(bc => bc.CustomerId);

modelBuilder.Entity<Invoice>()
    .ToTable("invoices", schemaName)
    .HasKey(i => new { i.Id });

//Here the code gives me problems
//1 BillingCenter -> N Invoices
modelBuilder.Entity<Invoice>()
    .HasRequired(i => i.BillingCenter)
    .WithMany(bc => bc.Invoices)
    .HasForeignKey(i => i.BillingCenterId);

modelBuilder.Entity<Payment>()
    .ToTable("payments", schemaName)
    .HasKey(ep => new { ep.Id })
    .Property(ep => ep.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

//1 Customer -> N Payments
modelBuilder.Entity<Payment>()
    .HasRequired(ep => ep.customer)
    .WithMany(c => c.Payments)
    .HasForeignKey(ep => ep.customerCode);

//1 Invoice -> N Payments (Failed, Ok, ...)
modelBuilder.Entity<Payment>()
    .HasRequired(p => p.Invoice)
    .WithMany(i => i.Payments)
    .HasForeignKey(p => p.InvoiceId);

如果我删除此代码,一切似乎都正常

modelBuilder.Entity<Invoice>()
    .HasRequired(i => i.BillingCenter)
    .WithMany(bc => bc.Invoices)
    .HasForeignKey(i => i.BillingCenterId);

并生成以下数据库:

我说这似乎是可行的,因为如果我看到计费中心和发票之间的关系,那么删除规则就是无操作。

我怎样才能解决这个问题?

提前谢谢你

共有1个答案

夹谷成仁
2023-03-14

我几乎可以肯定我没有周期

您确实有一个从客户付款的循环。如果您删除客户,那么付款可以通过客户-

如果我有级联路径,我就不会有问题。这是我想要的!

我相信这正是我们想要的。事实上,一些数据库(当然是Oracle)对于多个级联路径没有问题。不幸的是,SqlServer不支持它们,所以EF设计者决定不支持这种配置。

我说这似乎是可行的,因为如果我看到billingCenters和发票之间的关系,那么删除规则就不起作用了。

这是因为迁移失败并已回滚。它确实尝试设置删除级联。

我怎样才能解决这个问题?

你应该打破这个循环。您可以通过为至少一个关系客户关闭级联删除(通过在相应的关系配置中包括WillCascadeOnDelete(false))来实现这一点-

这样做将“解决”问题。我的意思是,您将能够成功运行迁移。但请注意,您可能会遇到维护问题-根据数据库处理FK约束的方式,可能无法简单地删除客户,并要求在删除之前手动删除相关记录(付款或计费中心)。

 类似资料:
  • 我收到了这个错误 在表“区域”上引入FOREIGN KEY约束“FK_dbo.Regions_dbo.Countries_CountryId”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。无法创建约束。请参阅以前的错误。 我想知道这是否意味着我的数据库设计不好?我听说你关掉了级联之类的东西,但

  • 问题内容: 从实体框架代码优先生成数据库时,出现此错误。 我没有看到脚本有任何问题: 每个参考都指向不同的表! 每个表上只能有一个删除级联吗? 如果我有3个表:Users,Posts和Votes。 与关系: Post.AuthorId-> User.Id投票.PostId-> Post.Id Votes.UserId-> User.Id SQL正确生成错误,因为如果删除帖子,我将有2条投票路径:用

  • 我正在尝试更新数据库,但出现此错误。这件事我已经纠结了一段时间,不太清楚到底发生了什么。 引入外键约束“FK\u dbo”。注释\u dbo。表“Comments”上的Users\u UserId可能导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他外键约束。无法创建约束或索引。请参阅以前的错误。 这是我的用户类: 下面是我的评论

  • 问题内容: 尝试向表中添加约束时出现问题。我得到了错误: 在表“ Employee”上引入FOREIGN KEY约束“ FK74988DB24B3C886”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 我的约束是在一个表和一个表之间。该表包括,,,和。的具有多个字段的标号,从而可以存在对于每

  • 我已经发现了许多其他类似的问题,但我不知道为什么它会在我的实体上这样做。用简单的英语表示如下。三个实体:账户、现场和合同。一个帐户可以有多个站点。一个帐户可以有多个合同。一个站点可以有多个合同。因此,在某些情况下,您可以将合同附加到站点,然后将其附加到帐户,或者将合同直接附加到帐户。 我假设我得到了这一点,因为删除合同有两种可能的级联,一种是在删除帐户时级联,另一种是直接附加到帐户,另一种是在删除

  • 我已经和这件事纠缠了一段时间,不太清楚到底发生了什么。我有一个卡实体,它包含两个边(通常是2个),并且卡和边都有一个舞台。我正在使用EF Codefirst迁移,迁移失败,出现以下错误: 在表“Sides”上引入外键约束“FK_dbo.Sides_dbo.Cards_cardd”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 这是我的卡实体: