0

我有4個實體需要存儲有關多倉單的詳細信息。EF:多列外鍵

訂單 - 訂單的標題。

倉庫 - 倉庫的細節。

OrderLines - 訂單中產品的詳細信息(包括其所屬的倉庫)。

OrderWarehouse - 有關僅與單個倉庫有關的訂單的詳細信息。

public class Order 
{ 
    public int Id { get; set; } 

    public virtual ICollection<OrderWarehouse> OrderWarehouses { get; set; } 

    public virtual ICollection<OrderLine> OrderLines { get; set; } 
} 

public class Warehouse 
{ 
    public int Id { get; set; } 

    public virtual ICollection<OrderWarehouse> OrderWarehouses { get; set; } 

    public virtual ICollection<OrderLine> OrderLines { get; set; } 
} 

public class OrderLine 
{ 
    public int Id { get; set; } 

    public int OrderId { get; set; } 

    public int ProductId { get; set; } 

    public int WarehouseId { get; set; } 

    [ForeignKey("OrderId")] 
    public virtual Order Order { get; set; } 

    [ForeignKey("WarehouseId")] 
    public virtual Warehouse Warehouse { get; set; } 

    public virtual OrderWarehouse OrderWarehouse { get; set; } // THIS IS WHERE I AM STRUGGLING 
} 

public class OrderWarehouse 
{ 
    [Key, Column(Order = 0)] 
    public int OrderId { get; set; } 

    [Key, Column(Order = 1)] 
    public int WarehouseId { get; set; } 

    [ForeignKey("OrderId")] 
    public virtual Order Order { get; set; } 

    [ForeignKey("WarehouseId")] 
    public virtual Warehouse Warehouse { get; set; } 

    public virtual ICollection<OrderLine> OrderLines { get; set; } // THIS IS WHERE I AM STRUGGLING 
} 

我似乎無法得到在OrderLines和OrderWarehouse之間正確定義的關係。

該鍵由OrderId,WarehouseId組成。

我知道這需要在上下文中定義,但我所有的嘗試都會引發錯誤。

有人可以幫助我嗎?

編輯:

如果我試試這個:

modelBuilder.Entity<OrderLine>() 
.HasOptional(u => u.OrderWarehouse) 
.WithMany() 
.HasForeignKey(u => new { u.OrderId, u.WarehouseId }); 

我得到:

OrderLine_OrderWarehouse:在 關係中的作用 引用約束 'OrderLine_OrderWarehouse_Target' 多重矛盾「 OrderLine_OrderWarehouse」。因爲從屬角色中的所有屬性 都是不可空的,所以Principal的多重性角色必須爲'1'。

回答

0

你有流暢的映射幾乎是正確的,但你不能指定一個非空值屬性的可選關係,如果你嘗試以下它應該工作。

modelBuilder.Entity<OrderLine>() 
.HasRequired(u => u.OrderWarehouse) 
.WithMany() 
.HasForeignKey(u => new { u.OrderId, u.WarehouseId });