C# 为表名添加前缀会导致删除鉴别器列

C# 为表名添加前缀会导致删除鉴别器列,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我有一个相当简单的查找表 public class LookupType : Entity { public LookupType() { } public LookupType(string value) { Value = value; } public string Value { get; set; } // A few other properties } 以及从中继承的几个类 public cla

我有一个相当简单的查找表

public class LookupType : Entity
{
    public LookupType()
    {
    }

    public LookupType(string value)
    {
        Value = value;
    }

    public string Value { get; set; }

    // A few other properties
}
以及从中继承的几个类

public class SomeType : LookupType
{
    public SomeType() 
    {
    }

    public SomeType(string value) 
        : base(value)
    {
    }
}
OnModelCreating
方法中,我还有以下查找类型的映射

// Lookup Types
modelBuilder.Entity<LookupType>()
            .Map<SomeType>(m => m.Requires("LookupType").HasValue("Some Type"));
但是,我需要在表名前加前缀。因此,在上下文的
OnModelCreating
方法中,我添加了以下行

modelBuilder.Types().Configure(entity => entity.ToTable("abc_" + entity.ClrType.Name));
创建迁移时,
LookupType
列现在不存在了

CreateTable(
            "dbo.abc_LookupType",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    DisplayOrder = c.Int(nullable: false),
                    Value = c.String(),
                    TimeStamp = c.Binary(nullable: false, fixedLength: true, timestamp: true, storeType: "rowversion"),
                })
            .PrimaryKey(t => t.Id);
我知道前缀配置是导致问题的原因,因为注释掉它并重新生成迁移将使LookupType列返回


列定义不应该更改,那么为什么要删除鉴别器列呢?有没有办法让我保留discriminator列并为表添加前缀?

我认为您需要在OnModelCreating中指定每个层次结构的表(TPH)继承:

public class FooDb : DbContext
    {
        public FooDb()
            : base("name=DefaultConnection")
        { }

        public DbSet<BarTypeA> BarTypesA { get; set; }
        public DbSet<BarTypeB> BarTypesB { get; set; }
        public DbSet<BarTypeC> BarTypesC { get; set; }



        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {


            modelBuilder.Entity<Foo>()
            .Map<LookupType>(m => m.Requires("xyx" + "FooType").HasValue("L"))
            .Map<BarTypeA>(m => m.Requires("xyx" + "LookupType").HasValue("A"))
            .Map<BarTypeB>(m => m.Requires("xyx" + "LookupType").HasValue("B"))
            .Map<BarTypeC>(m => m.Requires("xyx" + "LookupType").HasValue("C"));


        }
    }
控制台应用程序

static void Main(string[] args)
    {

        using (var db = new FooDb())
        {
            List<Foo> foos = new List<Foo>(){
                new BarTypeA ("peanutsA"){ DisplayOrder=100,Package="packA"},
                new BarTypeA ("olivesA"){ DisplayOrder = 101,Package="packB" },
                new BarTypeB ("peanutsB"){ DisplayOrder = 200,Package="packC" },
                new BarTypeB ("olivesB"){ DisplayOrder = 201,Package="packD" },
                new BarTypeC ("peanutsC"){ DisplayOrder = 300,Package="packE" },
                new BarTypeC ("olivesC"){ DisplayOrder = 301,Package="packF" }
            };

            db.BarTypesA.Add((BarTypeA)foos[0]);
            db.BarTypesA.Add((BarTypeA)foos[1]);
            db.BarTypesB.Add((BarTypeB)foos[2]);
            db.BarTypesB.Add((BarTypeB)foos[3]);
            db.BarTypesC.Add((BarTypeC)foos[4]);
            db.BarTypesC.Add((BarTypeC)foos[5]);
            db.SaveChanges();
        }
        Console.WriteLine("Press any key to end");
        Console.ReadLine();

    }
希望微软能找到资源,彻底记录和提供样本,因为EF似乎如此强大。不确定上述内容是否适合您的场景,但肯定会生成一个有用的鉴别器列xyzLookupType。db迁移文件调试/obj缓存不同步时出现问题。仍在寻找良好的文档/书籍。
我不完全理解为什么没有将描述添加到表中,可能是因为我添加的是BarTypes,而不是根类型(可能需要虚拟属性)。还可能需要为祖先添加数据库集…

显然,如果实体框架不切换到“表/类型”,则无法在表/层次结构继承上指定任何自定义映射详细信息

最简单的修复方法就是添加
.ToTable(“abc\U LookupTypes”)

//查找类型
modelBuilder.Entity()
.Map(m=>m.Requires(“LookupType”).HasValue(“某些类型”))
.ToTable(“abc_LookupTypes”);
然后实体框架切换回TPH。与上面的行重复,但它不必在上下文文件中添加继承的类型

public class Foo
    {
        public int Id { get; set; }
        public int DisplayOrder { get; set; }
        public string Description { get; set; }
        public string Package { get; set; }
        public Byte[] TimeStamp { get; set; }
    }

    public class LookupType : Foo
    {
        public LookupType(){}

        public LookupType(string value)
        {
            Description = value;
        }

        public string Description { get; set; }
        // A few other properties
    }

    public class BarTypeA : LookupType
    {
        public BarTypeA() { }
        public BarTypeA(string value) : base(value) { }
    }

    public class BarTypeB : LookupType
    {
        public BarTypeB() { }
        public BarTypeB(string value) : base(value) { }
    }

    public class BarTypeC : LookupType
    {
        public BarTypeC() { }
        public BarTypeC(string value) : base(value) { }
    }
static void Main(string[] args)
    {

        using (var db = new FooDb())
        {
            List<Foo> foos = new List<Foo>(){
                new BarTypeA ("peanutsA"){ DisplayOrder=100,Package="packA"},
                new BarTypeA ("olivesA"){ DisplayOrder = 101,Package="packB" },
                new BarTypeB ("peanutsB"){ DisplayOrder = 200,Package="packC" },
                new BarTypeB ("olivesB"){ DisplayOrder = 201,Package="packD" },
                new BarTypeC ("peanutsC"){ DisplayOrder = 300,Package="packE" },
                new BarTypeC ("olivesC"){ DisplayOrder = 301,Package="packF" }
            };

            db.BarTypesA.Add((BarTypeA)foos[0]);
            db.BarTypesA.Add((BarTypeA)foos[1]);
            db.BarTypesB.Add((BarTypeB)foos[2]);
            db.BarTypesB.Add((BarTypeB)foos[3]);
            db.BarTypesC.Add((BarTypeC)foos[4]);
            db.BarTypesC.Add((BarTypeC)foos[5]);
            db.SaveChanges();
        }
        Console.WriteLine("Press any key to end");
        Console.ReadLine();

    }
CreateTable(
            "dbo.Foos",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    DisplayOrder = c.Int(nullable: false),
                    Description = c.String(),
                    Package = c.String(),
                    TimeStamp = c.Binary(),
                    xyxFooType = c.String(maxLength: 128),
                    xyxLookupType = c.String(maxLength: 128),
                })
            .PrimaryKey(t => t.Id);
// Lookup Types
modelBuilder.Entity<LookupType>()
        .Map<SomeType>(m => m.Requires("LookupType").HasValue("Some Type"))
        .ToTable("abc_LookupTypes");