如何使用Entity Framework自定义标识符列的名称、长度和值

本文关键字:Entity 何使用 Framework 自定义 标识符 | 更新日期: 2023-09-27 18:15:04

我尝试使用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

如何使用Entity Framework自定义标识符列的名称、长度和值

这里

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

你指定的鉴别符的名字是"Category",所以这个

if (property.Name == "Discriminator")

将计算为false,因此MaxLength将是EF的默认值。

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