在EF 6 CodeFirst中映射一个带有附加属性的连接表的正确方法



我有一个表——Instruments。该表的PK为InstrumentId,列为Book、Page、DocumentTypeId等。

我还有一个表——Orders。该表存储了用户创建的过滤器的信息。PK是OrderId,它有像OrderName等列。

思路是用户创建一个订单并为该订单定义过滤器。当应用过滤器时,将返回一组匹配的仪器。然后,用户将查看比赛,并为每场比赛添加注释和/或"收藏"标志。

我需要存储每个订单的匹配仪器列表以及用户笔记等。

由于多个用户订单可能引用相同的Instruments,我不能简单地向instrument添加注释并就此结束。

通常,我会添加第三个名为Matches的表。该表将包含以下列:OrderId、InstrumentId、IsFavorite、Notes。基本上,一个带有一些附加字段的连接表。

如果它是一个简单的连接问题(没有IsFavorite或Notes),则I将执行以下操作(假设已经创建了POCO对象区域):

public OrderConfiguration()
{
    ToTable("orders");
    HasKey("orderid");
    ...
    HasMany(o => o.Matches).WithMany().Map(x =>
    {
       x.ToTable("matches");
    };
}
public InstrumentConfiguration()
{
    ToTable("instruments");
    HasKey("instrumentid");
    ...
}

然而,我是否正确,因为我有额外的属性(IsFavorite &Notes)关于两个实体(Order和Instrument)之间的关系,我现在要同时引入一个新表和一个新实体吗?现在,我不能将这些列放入我的Matches表并以某种方式映射它们,对吗?我需要添加一个新实体——MatchedInstrument?MatchedInstrument看起来像这样:

public class MatchedInstrument 
{
    public int Id {get; set; }
    public int InstrumentId {get; set;}
    public bool IsFavorite {get; set;}
    public string Notes {get; set;}
}

然后我将添加一个MatchedInstrument表,其中包含Id、IntrumentId等。然后我将不得不改变match表有OrderId和MatchedInstrumentId?

这是正确的处理方法吗?

我将创建如下关系:

public class AppContext : DbContext
{
    public DbSet<Instrument> Instruments { get; set; }
    public DbSet<Order> Orders { get; set; }
}
public class Instrument
{
    public int Id { get; set; }
    public string Book { get; set; }
    public string Page { get; set; }
    public virtual ICollection<MatchedInstrument> MatchedInstruments { get; set; }
}
public class Order
{
    public int Id { get; set; }
    public string OrderName { get; set; }
    public virtual ICollection<MatchedInstrument> MatchedInstruments { get; set; }
}
public class MatchedInstrument
{
    public int Id { get; set; }
    public int InstrumentId { get; set; }
    public Instrument Instrument { get; set; }
    public int OrderId { get; set; }
    public Order Order { get; set; }
    public bool IsFavorite { get; set; }
    public string Notes { get; set; }
}

最新更新