2012-01-03 49 views
2

我知道這與NHibernate的工作,但我是新的EF代碼優先,並可以看到如何完成它。具有隱式轉換的類型可以使用實體框架進行映射嗎?

總之,我想一個屬性上我BazCode類型的實體FooEntity地圖,就好像BazCode是一個字符串(或intDateTime或其他),因爲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中的實體,或以其他方式允許隱式轉換?

+0

我想知道NH如何處理最後一行?後面帶有轉換的'=='運算符是(可能是任意複雜的)C#代碼。這怎麼可能在每種情況下被轉換成SQL來執行數據庫中的查詢?或者NH以某種方式「解析」轉換運算符的內容,並且 - 如果可以轉換 - 然後將其轉換爲SQL?對於EF我很確定最後一行是不可能的,即使'BazCode'是一個複雜的類型。 EF有辦法映射實體,但遺憾的是沒有一個是「複雜」的。在你的情況下,我可能會用'string'替換'BazCode'屬性。 – Slauma 2012-01-03 18:12:26

回答

1

編號EF僅支持few basic types和複雜類型。不支持轉換(EF甚至不允許您明確寫入轉換)。也正如@Slauma在評論中提到的那樣,您的隱式轉換對Linq-to-entities沒有意義,因爲C#轉換邏輯沒有轉換爲SQL。