创建数据库时EF Core关系抛出错误

时间:2018-04-18 16:40:32

标签: entity-framework entity-framework-core ef-core-2.0

我有一个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中的地址表似乎也错了。

1 个答案:

答案 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?