2

我尝试将 EF6 与我必须兼容的现有数据库一起使用。该数据库已由 nHibernate 生成,并且一些表使用 table-per-hierarchy (TPH) 继承模型。

鉴别器列被命名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.

4

1 回答 1

1

这里

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

您将鉴别器的名称指定为“类别”,因此

if (property.Name == "Discriminator")

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

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

于 2016-10-26T12:17:15.707 回答