Entity framework core 创建数据库时EF核心关系引发错误
我有一个Entity framework core 创建数据库时EF核心关系引发错误,entity-framework-core,ef-core-2.0,Entity Framework Core,Ef Core 2.0,我有一个地址类,我在客户类和订单类中使用它: public class Address { public Customer Customer { get; set } ... } public class Customer { ... public List<Address> Addresses { get; set;} } public class Order { ... public Customer Curstomer { g
地址
类,我在客户
类和订单
类中使用它:
public class Address
{
public Customer Customer { get; set }
...
}
public class Customer
{
...
public List<Address> Addresses { get; set;}
}
public class Order
{
...
public Customer Curstomer { get; set; }
public Address BillingAddress { get; set;}
public Address ShippingAddress { get; set;}
}
公共类地址
{
公共客户客户{get;set}
...
}
公共类客户
{
...
公共列表地址{get;set;}
}
公共阶级秩序
{
...
公共客户游标{get;set;}
公共广播计费地址{get;set;}
公共地址ShippingAddress{get;set;}
}
我成功地创建了迁移,但当我尝试更新数据库时,
出现以下错误:
引入外键约束
表“Order”上的“FK\u Order\u Address\u ShippingAddressId”可能会导致循环
或多个级联路径。指定在删除时不执行任何操作或在更新时不执行任何操作
操作,或修改其他外键约束。无法创建
约束或索引。请参阅前面的错误
建立这种关系的正确方式是什么?这个模型正确吗?因为我觉得很奇怪,
Address
是一个与Customer
相关的属性,但我也在Order
上使用它,但是复制OrderAddresses
表中的地址似乎也错了。要解决这个问题,将迁移过程中外键的onDelete
的引用更改为级联
以外的内容<代码>限制
可能是一个不错的选择。它看起来像这样:
constraints: table =>
{
table.PrimaryKey("PK_Order", x => x.Id);
table.ForeignKey(
name: "FK_Orders_BillingAddress_BillingAddressId",
column: x => x.BillingAddressId,
principalTable: "Addresses",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
只需将其更改为Restrict
或其他选项
为什么?
如果您有Cascade
,假设您要删除订单的BillingAddress
。这将尝试将删除级联到订单
,然后将其删除级联到发货地址
,然后尝试将该删除级联回订单,依此类推,因此SQL Server在循环级联删除时会正确出错
另请参见此问题:若要解决此问题,请在迁移到级联
以外的其他对象时更改外键的删除
的引用<代码>限制
可能是一个不错的选择。它看起来像这样:
constraints: table =>
{
table.PrimaryKey("PK_Order", x => x.Id);
table.ForeignKey(
name: "FK_Orders_BillingAddress_BillingAddressId",
column: x => x.BillingAddressId,
principalTable: "Addresses",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
只需将其更改为Restrict
或其他选项
为什么?
如果您有Cascade
,假设您要删除订单的BillingAddress
。这将尝试将删除级联到订单
,然后将其删除级联到发货地址
,然后尝试将该删除级联回订单,依此类推,因此SQL Server在循环级联删除时会正确出错
另请参见此问题:手动编辑迁移文件已成功。但是,你知道我如何使用fluent配置来解决这个问题吗?要在OnModelCreatingMethod
方法中使用.OnDelete()
方法,我需要执行如下操作builder.Entity().HasOne(x=>x.ShippingAddress).WithOne(x=>x.OnDelete(xxxx)
。但是在地址
类中,我没有对顺序
类的引用。Address
类引用了Customer
类。哼,刚刚发现我不必通知第二部分的参数。所以这是可行的:modelBuilder.Entity().HasOne(x=>x.ShippingAddress).WithMany().OnDelete(DeleteBehavior.Restrict)代码>。感谢手动编辑迁移文件成功。但是,你知道我如何使用fluent配置来解决这个问题吗?要在OnModelCreatingMethod
方法中使用.OnDelete()
方法,我需要执行如下操作builder.Entity().HasOne(x=>x.ShippingAddress).WithOne(x=>x.OnDelete(xxxx)
。但是在地址
类中,我没有对顺序
类的引用。Address
类引用了Customer
类。哼,刚刚发现我不必通知第二部分的参数。所以这是可行的:modelBuilder.Entity().HasOne(x=>x.ShippingAddress).WithMany().OnDelete(DeleteBehavior.Restrict)代码>。谢谢