Charプロパティを持つオブジェクトがあります。
public class Product
{
public char Code
{
get;
set;
}
}
Entity Frameworkは文字をマップできないようです(モデルオブジェクトからデータベーススキーマを作成すると、このフィールドがデータベースに表示されません)。とにかく私は流暢なAPIを使用して文字を(たとえば文字列に)マップできますか?モデルオブジェクトはレガシー共有ライブラリの一部なので、変更したくありません。
Char
はエンティティフレームワークの有効なプリミティブタイプではありません=エンティティフレームワークはマッピングしません。 CSDLリファレンス をチェックすると、有効なタイプのリストが表示されます(char
はその中にありません)。
データベースchar(1)
はstring
に変換されます( SQLからCSDLへの変換 )。 Char
は 固定長1の非Unicode文字列 として記述されます。
唯一の醜いオプションは、文字列を使用して2番目にマップされたプロパティであり、char
マップされていないプロパティはstring[0]
そのプロパティから。これは、いくつかの単純な型マッピングまたはコンバーターがEFでまったく見つからない例の1つにすぎません。
Fluent APIでは、次のようにHasColumnTypeメソッドを使用してデータベース列のデータ型を指定できます。
modelBuilder.Entity<Product>()
.Property(p => p.Code)
.HasColumnType("char");
Andre Artusの回答 here によると、HasColumnTypeはEF4.1で使用できます。
データ注釈を使用する場合、ColumnAttributeは同じことを実行できます。
[Column(TypeName="char")]
public string Code { get; set; }
私は想像したすべての方法を試しましたが、受け入れられた答えは、char型の問題を私の知る限り解決するためのユニークな方法であると言わなければなりません。
charタイプは、EntityFrameworkでは使用できません。
Fluent APIはこの制限に含まれています。
charをProperty(p => p.MyCharProperty)
に付けようとすると、Exceptionになります。
つまり、charプロパティは、Fluent APIでも属性でも使用できません。
最も簡単な解決策はこれです(Ladislav Mrnkaが提案)。
public class Product
{
public char Code { get; set; }
[Column("Code", TypeName="char")]
[MaxLength(1)]
public string CodeString
{
get { return Code.ToString(); }
set { Code = value[0]; }
}
}
注:あなたできないプロパティをプライベート、保護、または内部に配置します。 公開する必要があります。
Fluent APIのバージョンはこんな感じです。
public class Product
{
public char Code { get; set; }
//We need the property but we will use the Fluent API to replace the attributes
public string CodeString
{
get { return Code.ToString(); }
set { Code = value[0]; }
}
}
modelBuilder.Entity<Product>().Property(p => p.Code)
.HasTypeName("char")
.HasMaxLength(1)
テスト目的でのみこの問題に取り組む別の方法があります。設計モードからしばらくの間、フィールドをnullからnullに変換できるようにします。時々、それは制限されたSQL Management Studioです。 (設定の変更ツール->オプション->デザイナ->テーブルデータベースデザイナ-> [テーブルの作成に必要な変更を保存できないようにする]をオフにします。