将外键作为EF中的复合主键的子集

时间:2014-02-19 21:45:06

标签: c# entity-framework

我有一个包含复合主键的表:{OrderNumber,OrderLine,OrderItem},在{OrderNumber,OrderLine}上有一个外键。如何在实体框架中首先使用代码实现此目的?

我的尝试:

public class OrderDetails 
{
    [Key, ForeignKey("Order"), Column(Order = 0)]
    public int OrderNumber { get; set; }

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

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

    // ... Other properties
}

1 个答案:

答案 0 :(得分:1)

使用流畅的映射和导航属性很容易(实际上我更喜欢流畅的映射,因为它允许保持实体清晰而不用数据提供者特定属性“污染”它们)。假设您的订单类看起来像

public class Order
{
    public int Number { get; set; }
    public int Line { get; set; }
    // ...
    public virtual ICollection<OrderDetails> Details { get; set; }
}

然后映射会看起来像这样

modelBuilder.Entity<Order>()
    .HasKey(o => new { o.Number, o.Line });

modelBuilder.Entity<OrderDetails>()
    .HasKey(od => new { od.OrderNumber, od.OrderLine, od.OrderItem });

modelBuilder.Entity<OrderDetails>()
    .HasRequired(od => od.Order)
    .WithMany(o => o.Details)
    .HasForeignKey(od => new { od.OrderNumber, od.OrderLine });