2011-09-23 59 views
0

我有一個業務對象,說一個User。 A User有一個PhoneNumber字段,它由一個字符串表示。我出於最好的理由創建了一個PhoneNumber類,它隱含於/來自字符串運算符。我是否必須做任何特別的事情才能讓PhoneNumber寫成數據庫的字符串?目前,Entity已決定將我的PhoneNumber課程分爲幾個組成部分(AreaCodePrefix等),並將其分別保存到數據庫中。 PhoneNumber存儲在一個單獨的程序集中。在實體POCO中使用自定義數據類型?

public class PhoneNumber : IEquatable<PhoneNumber>, IComparable<PhoneNumber> 
{ 
    public static implicit operator string (PhoneNumber ph) 
    { 
     return ph.ToString(); 
    } 

    public static implicit operator PhoneNumber (string number) 
    { 
     return Parse(number); 
    } 

    public static PhoneNumber Parse(string number) 
    { 
     // ... 
    } 

    public override string ToString() 
    { 
     // produce a Parse-compatible output 
    } 
} 

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual PhoneNumber Phone { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
} 
+0

的EntityFramework正常工作把你的實體類和將每個屬性表示爲列。 PhoneNumber類是否是部分的,如果是這樣的話,您可以在PhoneNumber類的非生成部分中覆蓋您的ToString()。這樣,無論它如何存儲在數據庫中,對象可以爲您提供這些信息都無關緊要。 –

+0

它不是一個部分類,但該對象覆蓋了ToString()併產生了我期望的結果。我會更新一些示例代碼。 –

+0

好吧,所以我想這個問題是,爲什麼你想要存儲爲一個字符串,而不是實體表示形式的電話號碼。 EF總是會將屬性轉換爲列或屬性,具體取決於您是否先執行代碼。 –

回答

3

的唯一方法是這樣的一種變通方法:

// You want to store in same table and not a navigation property, right? 
// Then you need [ComplexType] 
[ComplexType] 
public class PhoneNumber : IEquatable<PhoneNumber>, IComparable<PhoneNumber> 
{ 
    // ... 

    public string FullNumber 
    { 
     get 
     { 
      return Prefix + "-" + AreaCode + " " + Number; // or whatever 
     } 
     set 
     { 
      AreaCode = ParseToAreaCode(value); // or so... 
      Prefix = ParseToPrefix(value);  // or so... 
      Number = ParseToNumber(value);  // or so... 
     } 
    } 

    [NotMapped] 
    public string AreaCode { get; set; } 
    [NotMapped] 
    public string Prefix { get; set; } 
    [NotMapped] 
    public string Number { get; set; } 
} 

這樣,你將只能得到在數據庫中FullNumber列。

+0

這就是我所需要的,實際上讓我爲電話號碼添加打包格式。非常感激! –

3

如果你的設計的其餘部分允許的話,你可以離開PhoneNumber類出的映射,讓User處理它的字符串表示,如:

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual string FirstName { get; set; } 

    public virtual string PhoneNumber 
    { 
     get { return this.PhoneNumber.ToString(); } // TODO: check for null 
     set { this.PhoneNumber = PhoneNumber.Parse(value); } 
    } 

    [NotMapped] 
    public virtual PhoneNumber Phone { get; set; } 
} 
+0

這是一個同樣可行的解決方案。我正在和Slauma一起,因爲我想讓PhoneNumber本身更加可重用,但是有很多情況下這種模式對我來說很有用。 –

相關問題