2010-06-14 80 views
0

我「繼承了」一箇舊的數據庫,其中日期作爲Int32值存儲(也是時間,但日期應該滿足此示例),即20090101 2009年1月1日。 我可以不改變這個數據庫的模式,因爲它仍舊被舊程序訪問。
但是我想寫一個使用EF作爲O/R-M的新程序。
現在我很想在我的模型中使用DateTime-Values。EntityFramework:使用用戶定義的訪問數據庫類型

有沒有辦法編寫自定義類型並將其用作EF-模型中的一個類型。

有點象類型 「OldDate」
與屬性:
DatabaseValue:Int23
值:日期時間(指定的日期部分,而所述時間部分總是0:00:00)

是這樣的EF模型可能嗎?

編輯:
我想我找到了我一直在尋找 - 但在NHibernate的,所以我會改寫:
是一樣的東西NHIbernates IUserType可能與EF?

回答

0

A ComlexType可以管理這個。我創建了一個類型LeagcyDate,它將int值存儲在DbData屬性中,並在日期中添加了隱式轉換。這種方法似乎合理可行。由於模型設計器支持EF4 ComplexType,因此添加一個不會再調用edmx。

隱式轉換我已經在部分類來完成,像這樣:

public partial class LegacyDate 
    { 
     public static implicit operator DateTime?(LegacyDate value) 
     { 
      return LegacyDateConverter.ToDate(value.DbData); 
     } 

     public static implicit operator LegacyDate(DateTime? value) 
     { 
      return new LegacyDate { DbData = LegacyDateConverter.ToLegacyDate(value) }; 
     } 
    } 

    internal static class LegacyDateConverter 
    { 
     public static DateTime? ToDate(int data) 
     { 
      if (data == 0) return null; 
      int year = data/10000; 
      int month = (data%10000)/100; 
      int day = data/1000000; 
      DateTime date; 

      try 
      { 
       date = new DateTime(year, month, day); 
      } 
      catch (Exception e) 
      { 
       throw new ArgumentException(String.Format(
        "Value {0} kan not be converted to DateTime", data), e); 
      } 
      return date; 
     } 

     public static int ToLegacyDate(DateTime? value) 
     { 
      int dateInt = 0; 
      if (value.HasValue) 
      { 
       dateInt = 
       value.Value.Year*10000 + value.Value.Month*100 + value.Value.Day; 
      } 
      return dateInt;    
     } 
    } 
相關問題