web-dev-qa-db-ja.com

Entity Framework 4.1の「コードのみ」のFluent APIを使用してcharプロパティをマップするにはどうすればよいですか?

Charプロパティを持つオブジェクトがあります。

public class Product
{
    public char Code
    {
        get;
        set;
    }
}

Entity Frameworkは文字をマップできないようです(モデルオブジェクトからデータベーススキーマを作成すると、このフィールドがデータベースに表示されません)。とにかく私は流暢なAPIを使用して文字を(たとえば文字列に)マップできますか?モデルオブジェクトはレガシー共有ライブラリの一部なので、変更したくありません。

46
dommer

Charはエンティティフレームワークの有効なプリミティブタイプではありません=エンティティフレームワークはマッピングしません。 CSDLリファレンス をチェックすると、有効なタイプのリストが表示されます(charはその中にありません)。

データベースchar(1)stringに変換されます( SQLからCSDLへの変換 )。 Char固定長1の非Unicode文字列 として記述されます。

唯一の醜いオプションは、文字列を使用して2番目にマップされたプロパティであり、charマップされていないプロパティはstring[0]そのプロパティから。これは、いくつかの単純な型マッピングまたはコンバーターがEFでまったく見つからない例の1つにすぎません。

69
Ladislav Mrnka

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; }
29
jk7

私は想像したすべての方法を試しましたが、受け入れられた答えは、char型の問題を私の知る限り解決するためのユニークな方法であると言わなければなりません。

charタイプは、EntityFrameworkでは使用できません。

Fluent APIはこの制限に含まれています。

charProperty(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)
1
Javier

テスト目的でのみこの問題に取り組む別の方法があります。設計モードからしばらくの間、フィールドをnullからnullに変換できるようにします。時々、それは制限されたSQL Management Studioです。 (設定の変更ツール->オプション->デザイナ->テーブルデータベースデザイナ-> [テーブルの作成に必要な変更を保存できないようにする]をオフにします。

0
Manoj Patil