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)。谢谢