EF:多列外键

时间:2014-11-03 13:05:26

标签: c# entity-framework foreign-keys foreign-key-relationship

我需要4个实体来存储有关多仓库订单的详细信息。

订单 - 订单的标题。

仓库 - 仓库的详细信息。

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'。因为所有的属性   在依赖角色中是不可空的,校长的多样性   角色必须为'1'。

1 个答案:

答案 0 :(得分:0)

您拥有的流畅映射几乎是正确的,但您无法在非可空属性上指定可选关系,如果您尝试以下操作,它应该可以正常工作。

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