C# 使用NHibernate的SqlDateTime溢出
我在数据库中使用NHibernate持久化我的对象C# 使用NHibernate的SqlDateTime溢出,c#,sql-server-2008,nhibernate,fluent-nhibernate,sqldatetime,C#,Sql Server 2008,Nhibernate,Fluent Nhibernate,Sqldatetime,我在数据库中使用NHibernate持久化我的对象 App对象定义了一个属性: public virtual DateTime ReleaseDate { get; set; } 在mappingClass中: Map(x => x.ReleaseDate).Not.Nullable(); 在SQLServer2008中,其数据类型为dateTime,不可为空 这是它第一次毫无错误地保存到数据库中。但是在更新应用程序信息之后,我遇到了SqlDateTime溢出。必须在1753年1月1日
App
对象定义了一个属性:
public virtual DateTime ReleaseDate { get; set; }
在mappingClass中:
Map(x => x.ReleaseDate).Not.Nullable();
在SQLServer2008中,其数据类型为dateTime
,不可为空
这是它第一次毫无错误地保存到数据库中。但是在更新应用程序信息之后,我遇到了SqlDateTime溢出。必须在1753年1月1日12:00:00 AM和9999年12月31日11:59:59 PM之间。
但应用程序发布日期是一个有效的日期时间:2/16/2014 2:21:58 AM
,并且不为空
所以我很困惑为什么会出现这种例外
ist<App> apps = session.QueryOver<Data.Model.App>()
.List()
.ToList();
.
.
.
.
for (int i = 0; i < apps.Count(); i++)
{
App appWithOldInfo = apps[i];
using (ITransaction transaction = session.BeginTransaction())
{
try
{
//updating app info
appWithOldInfo = UpdateAppInfo(appWithOldInfo, appWithNewInfo);
session.Update(appWithOldInfo);
transaction.Commit();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
ist apps=session.QueryOver()
.List()
.ToList();
.
.
.
.
对于(int i=0;i
请参见屏幕截图:
谢谢大家的宝贵意见 问题是我正在从数据库中提取
device
对象,该数据库具有属性LastActivityDate
List devices=session.QueryOver().List().ToList();
我在向数据库中添加了一个带有一些信息的设备对象之后,将这个属性添加到了模型中。
此属性为null,但我尚未将LastActivityDate定义为可为null的属性
所以这个对象和app对象在同一个会话中。当我刷新会话时,因为LastActivityDate
为空,SqlDateTime异常出现了
很简单。但是我花了几个小时来找到它!!你确定这是你数据库表中唯一的日期和时间吗?也许还有另一个你忘记了的日期和时间,默认为1/1/0001?是的,我确定。请看更新的帖子。还有另一个类型为
timeStamp
的字段用于跟踪实体的版本更改。值是多少关于这一点?这里的答案可能是在另一个实例中,默认的DateTime
-由会话加载。我怀疑的可能是appWithNewInfo
。如果这个(其他实例)只是在会话期间从DB加载的,即保存在会话中。Flush()
-即使此实例也会被持久化。因此,问题是另一个对象正在添加到NHibernate会话。在刷新(或在我的情况下是提交)时,如果会话中的所有对象都没有所有正确的数据,NHibernate会自动抛出。要防止出现这种情况,请添加一个.readonly()以这种方式对查询或查询进行扩展,NHibernate不会跟踪它。在Hashems示例中,他可以执行一个List devices=session.QueryOver().Readonly().List().ToList()