我正在嘗試使用流暢的 API 創建一個外鍵,但出現以下錯誤,老實說,我無法弄清楚如何減少集群的位元組數,或者為什么它甚至那么高。
Introducing FOREIGN KEY constraint 'FK_CustomerOrderLine_CustomerOrder_OrderCode' on table 'CustomerOrderLine' 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 or index. See previous errors.
Warning! The maximum key length for a clustered index is 900 bytes. The index 'PK_CustomerOrderLine' has maximum length of 904 bytes. For some combination of large values, the insert/update operation will fail.
客戶訂單.cs:
public class CustomerOrder
{
public string OrderCode { get; set; }
public string Table { get; set; }
public OrderStatus Status { get; set; }
public decimal Total { get; set; }
public bool Paid { get; set; }
public List<CustomerOrderLine> CustomerOrderLines { get; set; }
}
客戶訂單行:
public class CustomerOrderLine
{
public string OrderCode { get; set; }
public int OrderLine { get; set; }
public string Description { get; set; }
public int Quantity { get; set; }
}
流暢的API:
modelBuilder.Entity<CustomerOrder>(e =>
{
e.HasKey(p => p.OrderCode);
e.HasMany<CustomerOrderLine>()
.WithOne()
.OnDelete(DeleteBehavior.Cascade);
e.Property(p => p.Total)
.HasPrecision(2);
});
/* Customer Order Line */
modelBuilder.Entity<CustomerOrderLine>(e =>
{
e.HasKey(p => new { p.OrderCode, p.OrderLine });
e.HasOne<CustomerOrder>()
.WithMany();
});
uj5u.com熱心網友回復:
您收到的錯誤是因為你配置之間的關系CustomerOrder和CustomerOrderLine的兩倍。
modelBuilder.Entity<CustomerOrder>(e =>
{
e.HasKey(p => p.OrderCode);
e.HasMany<CustomerOrderLine>() // here the relationship is configured for the first time
.WithOne()
.OnDelete(DeleteBehavior.Cascade);
e.Property(p => p.Total)
.HasPrecision(2);
});
/* Customer Order Line */
modelBuilder.Entity<CustomerOrderLine>(e =>
{
e.HasKey(p => new { p.OrderCode, p.OrderLine });
e.HasOne<CustomerOrder>() // here it is configured a second time
.WithMany();
});
因此 EF 假設和之間存在兩種不同的關系CustomerOrder,CustomerOrderLine并且您希望它們都級聯(這是不可能的)。只需洗掉關系的第二個配置,錯誤就會消失。
您收到的警告可能是因為OrderCode是一個沒有配置最大長度的字串。添加適當的最大長度(例如 100 個字符)將適當地解決問題。
uj5u.com熱心網友回復:
一種解決方法是將主鍵“Id”引入資料庫生成的“CustomerOrderLine”,而不是復合鍵“OrderCode”和“OrderLine”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/340474.html
