Per*_*Per 5 c# code-first ef-code-first entity-framework-4.1
这是我的情况,非常简化.
我的课程;
public class ClassBase
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
}
public class ClassMiddle1 : ClassBase
{
}
public class ClassMiddle2 : ClassBase
{
public Guid Token { get; set; }
}
public class ClassA : ClassMiddle1
{
public string UserId { get; set; }
public string Username { get; set; }
}
public class ClassB : ClassMiddle2
{
public string Username { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
而我的OnModelCreating;
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ClassBase>()
.Map(m => {
m.Properties(p => new { p.Id});
m.ToTable("TableBase");
});
modelBuilder.Entity<ClassMiddle1>()
.Map<ClassMiddle1>(m =>
{
m.Properties(p => new { });
m.ToTable("TableBase");
});
modelBuilder.Entity<ClassMiddle2>()
.Map<ClassMiddle2>(m =>
{
m.Properties(p => new { p.Token });
m.ToTable("TableBase");
});
modelBuilder.Entity<ClassA>()
.Map<ClassA>(m =>
{
m.Properties(p => new
{
p.UserId,
p.Username
});
m.ToTable("TableA");
});
modelBuilder.Entity<ClassB>()
.Map<ClassB>(m =>
{
m.Properties(p => new
{
p.Username
});
m.ToTable("TableB");
}).Property(p => p.Username).HasColumnName("User");
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但Discriminator列默认为Discriminator,NVARCHAR(128).我读到可以使用下面的内容自己定义此列.
m.Requires("ClassType").HasValue(1);
Run Code Online (Sandbox Code Playgroud)
我把自己的可能性彻底改变了,但所有时间都陷入了死胡同.有人建议怎么做?
我将以另一个问题结束.由于我们的层次结构几乎与上面相同,但是更多的衍生类如C,D,E,F等等......说P.我们发现EF正在进行这个令人难以置信的大数据库查询(~150K).其他人遇到过这种情况?
我希望改变Discriminator至少最小化这个.据我所知,我们有一个非常整洁的类层次结构,但丑陋的查询集.
迟回答实际解决方案是如何进行的.只在这里写下来,因为围绕这个的文档并不那么容易找到.
我的解决方案最终如下...
modelBuilder.Entity<ClassBase>()
.Map(m => {
...
m.Requires("Discriminator").HasValue(1)
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2880 次 |
| 最近记录: |