我有一个Address
类,我在Customer
类和Order
类中使用:
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;}
}
我成功创建了迁移但是当我尝试update-database
时出现以下错误:
引入FOREIGN KEY约束 &#39; FK_Order_Address_ShippingAddressId&#39;在桌子上&#39;订购&#39;可能导致周期 或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。无法创建 约束或索引。查看以前的错误。
建立这种关系的正确方法是什么?这种建模是否正确?因为我觉得Address
是与Customer
相关的属性似乎很奇怪,但我也在Order
上使用它,但重复OrderAddresses
中的地址表似乎也错了。
答案 0 :(得分:3)
要解决此问题,请在迁移中将外键ReferentialAction
的{{1}}更改为onDelete
以外的其他内容。 Cascade
可能是个不错的选择。它看起来像这样:
Restrict
只需将其更改为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
的{{1}}。那会尝试将删除级联到BillingAddress
,然后将 删除级联到Order
,然后尝试级联 删除到订单等等,因此SQL Server正确地错误地循环级联删除。
另请参阅此问题:Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths - why?