C# 将外键作为EF中复合主键的子集
我有一个具有复合主键的表:{OrderNumber,OrderLine,OrderItem},在{OrderNumber,OrderLine}上有一个外键。如何在实体框架中使用代码优先实现这一点 我的尝试: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
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。这只会让事情变得更容易