2010-06-14 83 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;    
     } 
    } 
相关问题