c# - 在 Entity Framework 4.1 中将鉴别器列更改为 int

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

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

我的类(class);

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)。还有其他人遇到过这种情况吗?

我希望通过更改 Discriminator 来至少将其最小化。据此我说我们有一个非常整洁的类层次结构但是一个丑陋的查询集。

最佳答案

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

我的解决方案最终如下......

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

关于c# - 在 Entity Framework 4.1 中将鉴别器列更改为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5889965/

相关文章:

c# - 如何查询特定类型,然后获取底层文档

c# - NHibernate 'Bags' 在 Entity Framework 中的实现

asp.net - EntityFramework 反向 POCO 代码先生成单独的文件夹

C# 如何使用 AutoFixture 简化单元测试字符串参数

c# - 在 MVC Controller 中打开一个 websocket channel

entity-framework - 首先使用抽象类进行代码,无法生成 fk

.net - 使用 EF Code First 方法时的 MVC .Net 级联删除

c# - Entity Framework - 有没有一种方法可以在不使用 Include() 的情况下自动预先加载子实体?

c# - 如何使用 CORS 启用自定义 header ?

c# - 导航属性 Project.Models.Customer.SubCustomers 的声明类型与指定导航的结果不兼容