如何为以下关系配置EF映射:
public class OrderBook : BaseEntity
{
public OrderBook()
{
BuyOrders = new List<OrderBookItem>();
SellOrders = new List<OrderBookItem>();
}
public virtual ICollection<OrderBookItem> BuyOrders { get; set; }
public virtual ICollection<OrderBookItem> SellOrders { get; set; }
}
public class OrderBookItem : BaseEntity
{
public OrderType Type { get; set; }
public int OrderBookId { get; set; }
public virtual OrderBook OrderBook { get; set; }
}
我尝试了一些变体
public class OrderBookMap : DynamicLoadEntityTypeConfiguration<OrderBook>
{
public OrderBookMap()
{
ToTable(nameof(OrderBook));
this.HasKey(p => p.Id);
//this does not work
//this.HasMany<OrderBookItem>(p=>p.BuyOrders).WithRequired(i=>i.OrderBook).HasForeignKey<int>(s => s.OrderBookId);
//this.HasMany<OrderBookItem>(p=>p.SellOrders).WithRequired(i=>i.OrderBook).HasForeignKey<int>(s => s.OrderBookId);
}
}
public class OrderBookItemMap : EntityTypeConfiguration<OrderBookItem>
{
public OrderBookItemMap()
{
ToTable(nameof(OrderBookItem));
this.HasKey(p => p.Id);
//this leads to extra columns created
this.HasRequired(i => i.OrderBook).WithMany(d => d.BuyOrders).HasForeignKey(i => i.OrderBookId).WillCascadeOnDelete(false);
this.HasRequired(i => i.OrderBook).WithMany(d => d.SellOrders).HasForeignKey(i => i.OrderBookId).WillCascadeOnDelete(false);
}
}
但映射结果不正确,我认为在OrderBook和OrderBookItem表之间有一个FK就足够了:
可以某种方式使用Type属性,因为它有助于区分哪个项目是买入或卖出。
答案 0 :(得分:0)
在我的情况下,我决定将它拆分为3个表而不是OrderBook_id1和OrderBook_id2会更好: 手持订单 BuyOrder SellOrder
因此实体和映射最终如下:
public class OrderBook : BaseEntity
{
public OrderBook()
{
BuyOrders = new List<BuyOrder>();
SellOrders = new List<SellOrder>();
}
public virtual ICollection<BuyOrder> BuyOrders { get; set; }
public virtual ICollection<SellOrder> SellOrders { get; set; }
}
public abstract class OrderBookItem : BaseEntity
{
public int OrderBookId { get; set; }
public virtual OrderBook OrderBook { get; set; }
}
public class BuyOrder : OrderBookItem
{
}
public class SellOrder : OrderBookItem
{
}
public class OrderBookMap : EntityTypeConfiguration<OrderBook>
{
public OrderBookMap()
{
ToTable(nameof(OrderBook));
this.HasKey(p => p.Id);
}
}
public class BuyOrderMap : EntityTypeConfiguration<BuyOrder>
{
public BuyOrderMap()
{
Map(m =>
{
m.MapInheritedProperties();
m.ToTable(nameof(BuyOrder));
});
this.HasKey(p => p.Id);
this.HasRequired(i => i.OrderBook).WithMany(d => d.BuyOrders).HasForeignKey(i => i.OrderBookId).WillCascadeOnDelete(false);
}
}
public class SellOrderMap : EntityTypeConfiguration<SellOrder>
{
public SellOrderMap()
{
Map(m =>
{
m.MapInheritedProperties();
m.ToTable(nameof(SellOrder));
});
this.HasKey(p => p.Id);
this.HasRequired(i => i.OrderBook).WithMany(d => d.SellOrders).HasForeignKey(i => i.OrderBookId).WillCascadeOnDelete(false);
}
}