我正在使用nHibernate + FluentNHibernate和SQLite数据库。 所有日期都以“YYYY-MM-DD HH:MM:SS”
格式存储为文本如何指示nHibernate(或sqlite驱动程序???)截断某些字段的'YYYY-MM-DD'格式的时间部分和存储日期(并存储其他字段的完整日期)?
或者我如何指示将所有日期存储为整数?
我担心空间使用情况,因为日期在数据库中占用了大量空间,日期也有索引,因此我需要尽可能减少空间。
答案 0 :(得分: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);
}
}
使用DateTime
或TruncatedDateTimeAsStringType
映射您的FullDateTimeAsStringType
媒体资源:
<property name="TruncatedDateTime" type="Your.Namespance.TruncatedDateTimeAsStringType, Your.Assembly" />
<property name="NotTruncatedDateTime" type="Your.Namespance.FullDateTimeAsStringType, Your.Assembly" />