【问题标题】:Changing discriminator column to int in Entity Framework 4.1在 Entity Framework 4.1 中将鉴别器列更改为 int
【发布时间】:2011-05-04 21:15:22
【问题描述】:

这是我的情况,非常简单。

我的课;

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; }
}

还有我的 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");

}

这工作正常,但鉴别器列默认为鉴别器,NVARCHAR(128)。我读到可以使用如下内容自己定义此列。

m.Requires("ClassType").HasValue(1);

我彻底改变了我的可能性,但总是陷入死胡同。 任何人有建议如何做?

我将以另一个问题结束。由于我们的层次结构几乎与上述相同,但还有更多派生类,如 C、D、E、F 等等……比如说 P。我们发现 EF 正在执行这个令人难以置信的大数据库查询(~150K)。其他人遇到过这种情况吗?

我希望通过更改鉴别器至少可以最小化这种情况。我说我们有一个非常整洁的类层次结构,但查询集很丑。

【问题讨论】:

    标签: c# ef-code-first code-first entity-framework-4.1


    【解决方案1】:

    延迟回答实际解决方案的进展情况。只在这里写下来,因为这方面的文档并不容易找到。

    我的解决方案如下所示......

    modelBuilder.Entity<ClassBase>()
            .Map(m => {
                ...
                m.Requires("Discriminator").HasValue(1)
            });
    

    【讨论】:

      【解决方案2】:

      关于您的“令人难以置信的大数据库查询”:确实有performance and query generation issues with TPT inheritance mapping。似乎仍然没有解决这些问题的方法,只有这个模糊的公告(2010 年 8 月):

      好消息是我们正在努力 在这些问题上让EF不再 生成不必要的 SQL。坏的 消息是这需要一些时间 在修复交付之前 未来版本。

      (引用上面的链接文章。)

      【讨论】:

        猜你喜欢
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 2017-09-23
        相关资源
        最近更新 更多