代码之家  ›  专栏  ›  技术社区  ›  Nils

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

  •  0
  • Nils  · 技术社区  · 14 年前

    我“继承”了一个旧的数据库,其中日期存储为Int32值(也有次,但对于本例,日期应足够),即2009年1月1日的20090101。 我无法更改此数据库的架构,因为旧程序仍在访问它。
    不过,我想用ef作为O/R-M编写一个新程序。
    现在我希望在我的模型中有日期时间值。

    是否有方法编写自定义类型并将其用作EF模型中的类型?

    类似于“旧日期”类型
    具有属性:
    数据库值:Int23
    值:date time(指定日期部分,而时间部分始终为0:00:00)

    在EF模型中是否可能出现这种情况?

    编辑:
    我想我找到了我要找的东西-但是在NHibernate,所以我会重新措辞:
    在EF中是否可以使用NHIBERNATES IUSERTYPE?

    1 回复  |  直到 12 年前
        1
  •  0
  •   Nils    14 年前

    ComlexType 可以处理这个。我创造了一种类型 LeagcyDate 它将int值存储在 DbData 属性,并添加了到日期和从日期的隐式转换。这种方法似乎是可以合理管理的。由于模型设计器中支持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;            
            }
        }