EntityFramework:使用用户定义的类型访问数据库列

时间:2010-06-14 14:29:13

标签: database entity-framework types mapping

我“继承”了一个旧数据库,其中日期存储为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吗?

1 个答案:

答案 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;            
        }
    }