将一对父映射到一个父母,其中一个父母有两个孩子的链接

问题描述 投票:0回答:1

如何为以下关系配置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就足够了:enter image description here

Type属性可能会以某种方式使用,因为它有助于区分哪个项目是买入或卖出。

entity-framework one-to-many
1个回答
0
投票

在我的情况下,我认为最好将它拆分为3个表而不是OrderBook_id1和OrderBook_id2:OrderBook 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);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.