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

C# 将外键作为EF中复合主键的子集,c#,entity-framework,C#,Entity Framework,我有一个具有复合主键的表:{OrderNumber,OrderLine,OrderItem},在{OrderNumber,OrderLine}上有一个外键。如何在实体框架中使用代码优先实现这一点 我的尝试: public class OrderDetails { [Key, ForeignKey("Order"), Column(Order = 0)] public int OrderNumber { get; set; } [Key, ForeignKey("Ord

我有一个具有复合主键的表:{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
}

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

public class Order
{
    public int Number { get; set; }
    public int Line { get; set; }
    // ...
    public virtual ICollection<OrderDetails> Details { get; set; }
}
公共类秩序
{
公共整数{get;set;}
公共整数行{get;set;}
// ...
公共虚拟ICollection详细信息{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 });
modelBuilder.Entity()
.HasKey(o=>new{o.Number,o.Line});
modelBuilder.Entity()
.HasKey(od=>new{od.OrderNumber,od.OrderLine,od.OrderItem});
modelBuilder.Entity()
.HasRequired(od=>od.Order)
.有许多(o=>o.细节)
.HasForeignKey(od=>new{od.OrderNumber,od.OrderLine});

我也更喜欢fluent api。这只会让事情变得更容易