如何使用Entity Framework 6自定义鉴别器列的名称,长度和值

时间:2016-10-26 11:35:18

标签: c# entity-framework maxlength discriminator tph

我尝试将EF6与我必须兼容的现有数据库一起使用。 数据库由nHibernate生成,一些表使用每层次表(TPH)继承模型。

Discriminator列名为Category(而不是Discriminator),SQL长度为255(而不是128)。值也与EF产生的值不同。

如何配置EF以使用现有列(名称,大小和值)?

我尝试定义自定义约定:

protected class DiscriminatorRenamingConvention : IStoreModelConvention<EdmProperty>
{
    public void Apply(EdmProperty property, DbModel model)
    {
        if (property.Name == "Discriminator")
        {
            property.Name = "Category";
            property.MaxLength = 255;
        }
    }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<MyEntityA>().Map(x => x.Requires("Category").HasValue("CatA"));
    modelBuilder.Entity<MyEntityB>().Map(x => x.Requires("Category").HasValue("CatB"));
    modelBuilder.Conventions.Add<DiscriminatorRenamingConvention>();
    base.OnModelCreating(modelBuilder);
}

这会生成一个名为Category的列,但长度为128,无论OnModelCreating方法中的指令顺序如何。指定类别值似乎会覆盖MaxLength

1 个答案:

答案 0 :(得分:0)

下面

modelBuilder.Entity<MyEntityA>().Map(x => x.Requires("Category").HasValue("CatA"));

指定鉴别器的名称为&#34;类别&#34;,所以这个

if (property.Name == "Discriminator")

将评估为false,因此MaxLength将是EF默认值。

要获得所需的行为,请使用Requires("Discriminator")并让惯例完成其余的工作。