Mat*_*ton 17 entity-framework-4.1
我有一个类层次结构,我想使用Entity Framework 4.1 Code First映射到几个表.它就像每个类型的表(TPT),但我也想要一个discrimator列.
层次结构类似于:
public class Event
{
public Guid Id { get; set; }
public string Code { get; set; } // discriminator
public DateTime Date { get; set; }
}
public class Party : Event
{
public int AttendeeCount { get; set; }
}
public class BirthdayParty : Party
{
public int Age { get; set; }
}
public class WeddingParty : Party
{
public string Surname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常弱的例子,但我希望它有意义.将有一个"事件"表,一个"缔约方"表格和每种派对的表格.但是,鉴别器列("代码")将针对每种事件具有已知值,例如生日派对的"出生"或婚礼派对的"婚礼".
我的想法是,如果我在给定日期只查询生日派对,EF会知道添加Code = 'BIRTH'到我的查询而不是做一堆UNION和JOIN来计算出它需要哪些行.
我映射了我这样的最低级别的类:
var bd = modelBuilder.Entity<BirthdayParty>();
bd.ToTable("BirthdayParties");
bd.Property(p => p.Age).HasColumnName("BirthdayAge");
Run Code Online (Sandbox Code Playgroud)
我现在需要以某种方式指定鉴别器值.我试过这个:
modelBuilder.Entity<Event>().Map<BirthdayParty>(cfg =>
{
cfg.Requires("Code").HasValue("BIRTH");
});
Run Code Online (Sandbox Code Playgroud)
...但是抱怨我没有在调用中指定表名Map.所以我尝试将ToTable呼叫转移到那里:
var bd = modelBuilder.Entity<BirthdayParty>();
bd.Property(p => p.Age).HasColumnName("BirthdayAge");
modelBuilder.Entity<Event>().Map<BirthdayParty>(cfg =>
{
cfg.Requires("Code").HasValue("BIRTH");
cfg.ToTable("BirthdayParties");
});
Run Code Online (Sandbox Code Playgroud)
...现在它认为我想要"BirthdayParties"表中的"代码"列,这是不正确的.我已经告诉它"代码"列在"事件"表中.
这甚至可能吗?我可以将鉴别器列的使用与每个类型的映射结合起来吗?
不幸的是,这不受支持.Discriminator列只能在TPH中使用.TPT通过映射表来区分实体类型,并且它总是产生那些可怕的查询.它可能是一个很好的功能,所以也许有关Data UserVoice的建议会让它实现一天.
更新
对于标题为" TPT继承中的Discriminator列支持 "的用户语音已有建议.
| 归档时间: |
|
| 查看次数: |
2259 次 |
| 最近记录: |