gpt4 book ai didi

asp.net-mvc - 在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径导致 Database.SetInitializer 无法工作?

转载 作者:行者123 更新时间:2023-12-02 17:58:22 26 4
gpt4 key购买 nike

我的代码优先数据库运行良好。如果我对数据库上下文进行了更改,则数据库将在下次启动应用程序时更新。但后来我向数据库添加了一些模型,并在重新启动应用程序时收到此错误:

Introducing FOREIGN KEY constraint 'FK_OrderDetails_Orders_OrderId' on table 'OrderDetails' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.

奇怪的事情之一是,如果我在不更改任何内容的情况下再次启动应用程序,则会收到此错误:

Model compatibility cannot be checked because the database does not contain model metadata. Model compatibility can only be checked for databases created using Code First or Code First Migrations.

为了让第一个错误再次发生,我必须删除我的 .mdf 和 .ldf 文件(数据库),并用我的修订历史记录中的副本替换 .mdf 文件。

到底为什么会发生这种情况?

<小时/>

供引用:

我的 Global.asax.cs 文件在 Application_Start() 中包含此内容方法:

Database.SetInitializer<EfDbContext>(new EfDbContextInitializer());

看起来像这样:

public class EfDbContextInitializer : DropCreateDatabaseIfModelChanges<EfDbContext>
{
protected override void Seed(EfDbContext context)
{
var orders = new List<Order>
{
. . .
};
orders.ForEach(s => context.Orders.Add(s));
. . . etc. . .
context.SaveChanges();
}
}

我的连接字符串来自Web.config :

<add name="EFDbContext" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;database=pos;AttachDBFilename=|DataDirectory|pos.mdf;MultipleActiveResultSets=true;User Instance=true" providerName="System.Data.SqlClient" />

最后,我的 Order 和 OrderDetails 模型(第一个错误是直接引用的):

public class Order
{
public int OrderId { get; set; }

public List<OrderDetail> OrderDetails { get; set; }

public int EstablishmentId { get; set; }

public virtual Establishment Establishment { get; set; }
}

public class OrderDetail
{
public int OrderDetailId { get; set; }

public int OrderId { get; set; }

public int ProductId { get; set; }

public int Quantity { get; set; }

public decimal UnitPrice { get; set; }

public virtual Product Product { get; set; }

public virtual Order Order { get; set; }
}

更新/注意:如果我注释掉public int OrderId { get; set; }在我的 OrderDetail 类中,项目启动正常(尽管我没有获得添加 OrderId 的所需能力(当然)。

最佳答案

此问题是由可能的循环级联删除引起的。这种情况可能以多种形式发生,但归根结底是一条记录被两个或多个级联删除规则同时删除。

例如,假设您有父表和两个子表。然后您还有另一个链接到两个子表的表:

Parent
------
ParentId
Name

ChildOne
--------
ChildOneId
ParentId
Name

ChildTwo
--------
ChildTwoId
ParentId
Name

SharedChild
-----------
SharedChildId
ChildOneId
ChildTwoId
Name

当您从父表中删除一条记录时,此删除操作可能会同时级联到 ChildOne 和 ChildTwo。然后,这两个删除可以进一步级联到 SharedChild,这里我们遇到了问题:两条路径试图从 SharedChild 中删除相同的记录。

我并不是说您的情况完全相同,但无论如何,您都会遇到类似的情况。为了解决这个问题,您可以决定让一个分支被允许在链中进一步级联,并阻止它出现在另一条链中。

仅在第一次运行应用程序以及每次删除数据库时出现此错误的原因是(我相信) Entity Framework 在错误发生时停止生成数据库,并且您留下了一个数据库不完整。这就是您在其他情况下收到其他错误的原因。

如果您需要更多帮助来解决循环级联删除问题,您可能需要显示整个数据模型及其关系。

关于asp.net-mvc - 在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径导致 Database.SetInitializer 无法工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11864704/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com