我有一个 MVC4 项目,其中已经创建了 DB (Sql2008) 和 Models (C#),因此无法更改它们的名称。我开始为我正在使用的每个类使用带有自定义配置的 EF4.1,因此在创建模型时,所有内容都会映射到数据库。大多数情况下,所有表的名称为“tbl_X_”+ entityName,主键为 entityName +“ ID”。其他人有“tbl ”+ entityName 和其他主键。为了避免重复代码,我创建了一个自定义 EntityTypeConfiguration:
public abstract class BaseConfiguration<T> : EntityTypeConfiguration<T>
where T: class
{
public BaseConfiguration()
{
Map(x => x.ToTable("tbl_X_" + typeof(T).Name));
var parm = Expression.Parameter(typeof(T), typeof(T).Name);
var propExpression = Expression.Lambda<Func<T, int>>
(Expression.Convert(Expression.Property(parm, "Id"), typeof(int)), parm);
Property(propExpression).HasColumnName(typeof(T).Name + "_ID");
}
}
这在大多数情况下都可以正常工作,除非表名不遵循该约定并且我将表与其给定名称映射:
public class CompanyConfiguration : BaseConfiguration<Company>
{
public CompanyConfiguration()
{
Map(x => x.ToTable("tbl_Company"));
//Key does follow convention
}
}
当我构建时,我得到了错误
“‘公司’类型的属性只能映射一次。”
我绝对知道会发生这种情况,因为我映射了两次,一次在基础上,另一次在派生类上。如果tableName 和primaryKeyName 都有第二个映射,我想知道是否可以覆盖第一个。
提前致谢!
编辑:一些实体需要歧视。
Map(x => x.Requires("discriminatorColumn")
.HasValue(value)
.HasColumnType("dataType")
.IsRequired())
.ToTable("tbl_TableName");