如何使用 Entity Framework 6 自定义鉴别器列的名称、长度和值
How to customize name, length and value of a discriminator column with Entity Framework 6
我尝试将 EF6 与我必须兼容的现有数据库一起使用。
数据库由 nHibernate 生成,一些 table 使用 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
.
这里
modelBuilder.Entity<MyEntityA>().Map(x => x.Requires("Category").HasValue("CatA"));
你指定鉴别器的名字是"Category",所以这个
if (property.Name == "Discriminator")
将计算为 false
,因此 MaxLength
将是 EF 默认值。
要获得所需的行为,请使用 Requires("Discriminator")
并让约定完成其余的工作。
我尝试将 EF6 与我必须兼容的现有数据库一起使用。 数据库由 nHibernate 生成,一些 table 使用 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
.
这里
modelBuilder.Entity<MyEntityA>().Map(x => x.Requires("Category").HasValue("CatA"));
你指定鉴别器的名字是"Category",所以这个
if (property.Name == "Discriminator")
将计算为 false
,因此 MaxLength
将是 EF 默认值。
要获得所需的行为,请使用 Requires("Discriminator")
并让约定完成其余的工作。