2016-10-26 3 views
2

既存のデータベースでEF6を使用しようとしていますが、互換性が必要です。 データベースはnHibernateによって生成されており、一部のテーブルは階層ごとのテーブル(TPH)継承モデルを使用しています。エンティティフレームワーク6でディスクリプタ列の名前、長さ、および値をカスタマイズする方法

ディスクリミネータ列の名前はCategoryDiscriminatorではなく)で、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); 
} 

これはOnModelCreatingメソッド内の命令のどんな順番Categoryが、128の長さという名前の列を生成します。カテゴリの値を指定すると、MaxLengthを上書きしているようです。

if (property.Name == "Discriminator") 

+0

ここでは最大長とは何ですか?列(Name)などの名前の長さが255であるNameのプロパティですか? @daltonwide – Rajput

+0

私はので、私はコードがコメントに書き込むことができないので、これはそれを修正することができかもしれ答えに提供していますnvarchar型としてSQLカラム(255) – daltonwide

+0

をマップするためのMaxLengthを使用しています。@ daltonwide – Rajput

答えて

0
ここ

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

あなたは "カテゴリー" であることを弁別の名前を指定し、これは、falseと評価されますので、MaxLengthは、EFのデフォルトになります。

目的の動作を取得するには、Requires("Discriminator")を使用して、残りの作業を行います。

+0

いいえ、「DiscriminatorRenamingConvention」は正常に動作しますそれだけで。弁別者列は正しく「カテゴリ」に変更されます。カスタムの長さが128に戻るカテゴリの値を指定するときだけです。 – daltonwide

+0

なぜ、あなたは答えを試していないのですか?私はいつも投稿する前にテストします。私が言ったことをしてください。 –

+0

私の謝罪、それは私には非論理的だが、あなたは正しい。ありがとう! – daltonwide

関連する問題