gpt4 book ai didi

c# - 在不使用 IUserType 查询数据库时如何防止 NHibernate SqlDateTime 溢出?

转载 作者:太空宇宙 更新时间:2023-11-03 20:50:53 25 4
gpt4 key购买 nike

在执行如下 NHibernate Linq 查询时是否可以防止此异常:

var dateFilter = DateTime.Parse("1500-01-01");
return _session.Query<Log>().Where(l => l.Date > dateFilter).ToList();

结果:SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。

我想将日期设置为支持的最小日期值。在插入和更新数据库时,我已经在使用拦截器来执行此操作,但我正在寻找修复选择查询的解决方案。

public class DataInterceptor : EmptyInterceptor
{
public override bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, IType[] types)
{
DateTimeMinValueToNull(currentState, types);
return base.OnFlushDirty(entity, id, currentState, previousState, propertyNames, types);
}

public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types)
{
DateTimeMinValueToNull(state, types);
return base.OnSave(entity, id, state, propertyNames, types);
}


// Prevents the application from crashing when an object's DateTime value is lower than the SQL datetime min value
private void DateTimeMinValueToNull(object[] state, IType[] types)
{
for (int i = 0; i < types.Length; i++)
{
if (types[i].ReturnedClass == typeof(DateTime))
{
var value = (DateTime?)state[i];
if (value.HasValue && value.Value < (DateTime)SqlDateTime.MinValue)
{
state[i] = (DateTime)SqlDateTime.MinValue;
}
}
}
}
}

最佳答案

without using an IUserType

此限制是否只是为了避免更改您的映射?

在 NHibernate 5.2 中,您可以将自定义类型注册为所有 DateTime 属性的默认类型:

//Somewhere before SessionFactory is created
TypeFactory.RegisterType(typeof(DateTime), new YourCustomDateTime(), new[] {"DateTime"});

使用此解决方案,您不需要当前的拦截器。

关于c# - 在不使用 IUserType 查询数据库时如何防止 NHibernate SqlDateTime 溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55420952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com