C# 带鉴别器的多对多-无继承
我至少有四个这样的实体C# 带鉴别器的多对多-无继承,c#,entity-framework-6,C#,Entity Framework 6,我至少有四个这样的实体 public class Item { public int ItemID { get; set; } public ICollection<Price> Prices; . . . . } public class OtherThing { public int ThingID { get; set; } public ICollection<Price> Prices; . . . . }
public class Item {
public int ItemID { get; set; }
public ICollection<Price> Prices;
. . . .
}
public class OtherThing {
public int ThingID { get; set; }
public ICollection<Price> Prices;
. . . .
}
目标是能够获得一个Set()
或Set()
,并以正确的价格对价格进行调整
一个想法是制作一个ItemPrice表和一个OtherThingPrice表,但是这些表是相同的,并且会一起改变,所以这个想法被抛弃了
另一个想法是使用TPH,但Price不是这四个+表的基类,因此它在语义上似乎是错误的,我甚至不确定它是否会工作(会吗?)
我们的想法是这样做:
public class PriceMap : EntityTypeConfiguration<Price>
{
public PriceMap()
{
Map<Item>(m => m....);
Map<OtherThing>(m => m....);
}
}
那么遗产呢:好吧,物品、其他东西、东西等等都不是价格类型。从技术上讲,它们不是一种相关的东西,除了它们都与价格有很多关系这一事实。因此,为什么标题说“无继承”,单独的隐式链接表有什么问题?EF将为您自动维护它们(不需要特殊的中间实体)。如果
项
,其他东西
等没有公共基础实体(表),这是最简单的。嗨,伙计,一点问题都没有:)(1)它不一定需要。仅在其他实体端(如modelBuilder.entity.HasMany(e=>e.Prices).WithMany();
等),与导航属性的关联可能是单向的。(2)如果在某个时候需要,这可能是个问题。您可以通过投影公共数据来执行一些手动联合查询,但这将是一个难题。因此,如果您需要类似的内容,最好引入一个公共基础实体,如PriceableEntity
(:-),统一PK和其他公共属性名称,并使用TPH或TPT。@IvanStoev明白了。只是一个占位符基类,除了Price的关系信息外没有其他内容。我喜欢选项1,并将推动承认,你永远不需要从一个价格到一个项目或其他东西(在我们的情况下)。
public class PriceMap : EntityTypeConfiguration<Price>
{
public PriceMap()
{
Map<Item>(m => m....);
Map<OtherThing>(m => m....);
}
}
EntityToPriceTable
EntityToPriceID
EntityID
EntityType
PriceID