2012-01-03 13 views
2

これはNHibernateで動作することが分かっていますが、私はEFコードファーストで初めてです。要するに暗黙の変換を持つ型をEntity Frameworkにマップできますか?

は、私は、文字列(またはintまたはDateTimeまたは何が)だったBazCodeかのようBazCodeは、その型への/からの暗黙的な変換を持っているので、タイプBazCodeの私のエンティティFooEntityのプロパティをマップします。使用量の

public class FooEntity 
{ 
    public int FooId { get; set; } 
    public string SomeText { get; set; } 
    public BazCode Code { get; set; } 
} 

public class BazCode 
{ 
    private readonly string _value; 

    private BazCode(string s) 
    { 
     if(s.Length != 8) 
     { 
      throw new ArgumentException("BazCode must be 8 characters.") 
     } 

     _value = s; 
    } 

    public static implicit operator BazCode(string s) 
    { 
     return new BazCode(s); 
    } 

    public static implicit operator string(BazCode code) 
    { 
     return code._value; 
    } 
} 

var foo = new FooEntity 
{ 
    SomeText = "here is some text", 
    Code = "A1234567" 
} 

BazCodeが暗黙的にキャストすることができますので/文字列から、私はそれだけで動作しますNHibernateは、通常、それをマッピングすることができます。

EFでは、マッピングを明示的に定義する唯一の方法は、匿名型のコンストラクタを使用することですが、キャストは使用できないため、何も購入しません。

私はEFの複合型のコンセプトを認識していますが、それは私が理解できる限り、同じものではありません。私はそれが必要だと思う:

context.Foos.Where(foo => foo.BazCode.Value == "B9876543") 

代わりの

context.Foos.Where(foo => foo.BazCode == "B9876543") 

はこれがすべてで暗黙の型変換を活用しません。

エンティティをEFにマップする方法や、暗黙的な変換を許可する方法がありますか?

+0

NHが最後の行をどのように処理できるのだろうか?変換の背後にある '=='演算子は(おそらく任意の複雑な)C#コードです。どのようにしてこれをどのようにしてデータベースにクエリを実行するためにSQLに変換できますか?あるいは、NHは何らかの形で変換演算子の内容を "解析"し、翻訳可能ならばそれをSQLに変換しますか? EFの場合、 'BazCode'が複雑な型であっても、最後の行は不可能であると確信しています。 EFはエンティティをマッピングする方法を持っていますが、悲しいことにそれらのどれもが "洗練された"ものではありません。あなたの場合、私は 'BazCode'プロパティを' string'で置き換えるでしょう。 – Slauma

答えて

1

番号EFは、few basic typesと複合タイプのみをサポートします。変換はサポートされていません(EFでは明示的に変換を記述することもできません)。 @Slaumaがコメントで述べたように、暗黙の変換はC#変換ロジックがSQLに変換されないため、Linqからエンティティへは意味をなさないでしょう。

関連する問題