DB (Sql2008) とモデル (C#) が既に作成されている MVC4 プロジェクトがあるため、どちらの名前も変更できません。使用している各クラスのカスタム構成で 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
}
}
ビルドするとエラーが発生します
「タイプ 'Company' のプロパティは、一度しかマッピングできません。」
これが発生するのは、1 つはベース、もう 1 つは派生クラスの 2 回マッピングしているためです。tableName と primaryKeyName の両方に 2 番目のマッピングがある場合、最初のマッピングをオーバーライドできるかどうかを知りたいです。
前もって感謝します!
編集: 一部のエンティティには差別が必要です。
Map(x => x.Requires("discriminatorColumn")
.HasValue(value)
.HasColumnType("dataType")
.IsRequired())
.ToTable("tbl_TableName");