2012-10-20 80 views
1

我使用nHibernate + FluentNHibernate与SQLite数据库。 所有日期都以文本格式'YYYY-MM-DD HH:MM:SS'存储。nHibernate与SQLite格式日期

如何指示nHibernate(或sqlite驱动程序???)将时间部分和存储日期截断为'YYYY-MM --DD'格式的某些字段(并存储其他字段的完整日期)?

或者我该如何指导将所有日期存储为整数?

我很关心空间使用情况,因为日期需要数据库中的大量空间,并且日期也有索引,所以我需要尽可能减少空间。

回答

2

如果您手工将DateTime转换为String,我看不到任何问题以将字符串格式替换为YYYY-MM-DD

如果让NHibernate的执行此转换,那么你可以创建自定义的NHibernate UserType像这样:

public abstract class DateTimeAsStringType : IUserType 
{ 
    public object Assemble(object cached, object owner) 
    { 
     return cached; 
    } 

    public object DeepCopy(object value) 
    { 
     return value; 
    } 

    public object Disassemble(object value) 
    { 
     return value; 
    } 

    public bool Equals(object x, object y) 
    { 
     if (ReferenceEquals(x, y)) 
      return true; 

     if (x == null && y == null) 
      return false; 

     return x.Equals(y); 
    } 

    public int GetHashCode(object x) 
    { 
     return x.GetHashCode(); 
    } 

    public bool IsMutable 
    { 
     get { return false; } 
    } 

    public object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner) 
    { 
     var serialized = NHibernateUtil.String.NullSafeGet(rs, names[0]) as string; 

     if (string.IsNullOrEmpty(serialized)) 
      return null; 

     return Deserialize(serialized); 
    } 

    protected abstract DateTime Deserialize(string value); 
    protected abstract string Serialize(DateTime value); 

    public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index) 
    { 
     if (value == null) 
      NHibernateUtil.String.NullSafeSet(cmd, DBNull.Value, index); 
     else 
      NHibernateUtil.String.NullSafeSet(cmd, Serialize((DateTime)value), index); 
    } 

    public object Replace(object original, object target, object owner) 
    { 
     return original; 
    } 

    public Type ReturnedType 
    { 
     get { return typeof(DateTime); } 
    } 

    public NHibernate.SqlTypes.SqlType[] SqlTypes 
    { 
     get { return new[] { NHibernateUtil.String.SqlType }; } 
    } 
} 

public class TruncatedDateTimeAsStringType : DateTimeAsStringType 
{ 
    private const string Format = "yyyy-MM-dd"; 

    protected override string Serialize(DateTime value) 
    { 
     return value.ToString(Format, CultureInfo.InvariantCulture); 
    } 

    protected override DateTime Deserialize(string value) 
    { 
     return DateTime.ParseExact(value, Format, CultureInfo.InvariantCulture, DateTimeStyles.None); 
    } 
} 

public class FullDateTimeAsStringType : DateTimeAsStringType 
{ 
    private const string Format = "yyyy-MM-dd hh:mm:ss"; 

    protected override string Serialize(DateTime value) 
    { 
     return value.ToString(Format, CultureInfo.InvariantCulture); 
    } 

    protected override DateTime Deserialize(string value) 
    { 
     return DateTime.ParseExact(value, Format, CultureInfo.InvariantCulture, DateTimeStyles.None); 
    } 
} 

而且使用无论是TruncatedDateTimeAsStringTypeFullDateTimeAsStringType映射您DateTime属性:

<property name="TruncatedDateTime" type="Your.Namespance.TruncatedDateTimeAsStringType, Your.Assembly" /> 
<property name="NotTruncatedDateTime" type="Your.Namespance.FullDateTimeAsStringType, Your.Assembly" /> 
+0

这只是工作。谢谢。 – xll