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