我“继承”了一个旧数据库,其中日期存储为Int32值(时间也是如此,但日期应足以满足此示例),即2009年1月1日的20090101。 我无法更改此数据库的架构,因为旧程序仍然可以访问它 但是我想用EF作为O / R-M编写一个新程序 现在我想在我的模型中使用DateTime-Values。
有没有办法编写自定义类型并将其用作EF模型中的Type。
类似“OldDate”的类型
具有属性:
DatabaseValue:Int23
值:DateTime(指定日期部分,而时间部分始终为0:00:00)
EF模型是否可以这样?
编辑:
我想我找到了我想要的东西 - 但是在NHibernate中,所以我会改写:
类似于NHIbernates IUserType可以用EF吗?
答案 0 :(得分:0)
ComlexType可以管理这个。我创建了一个Type LeagcyDate
,它将int值存储在DbData
属性中,并在Date中添加了一个隐式转换。这种方法似乎相当容易管理。由于模型设计器支持EF4 ComplexTypes,因此添加一个不会再调用对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;
}
}