2
我知道這與NHibernate的工作,但我是新的EF代碼優先,並可以看到如何完成它。具有隱式轉換的類型可以使用實體框架進行映射嗎?
總之,我想一個屬性上我BazCode
類型的實體FooEntity
地圖,就好像BazCode
是一個字符串(或int
或DateTime
或其他),因爲BazCode
有該類型的隱式轉換到/。
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有辦法映射實體,但遺憾的是沒有一個是「複雜」的。在你的情況下,我可能會用'string'替換'BazCode'屬性。 – Slauma 2012-01-03 18:12:26