使用 NHibernate 的 SqlDateTime 溢出

问题描述 投票:0回答:2

我使用 NHibernate 在数据库中保存我的对象

App
对象定义了一个属性:

public virtual DateTime ReleaseDate { get; set; }

在映射类中:

Map(x => x.ReleaseDate).Not.Nullable();

在 sqlServer 2008 中,其数据类型为

dateTime
并且不可为空。

第一次保存到数据库时没有错误。但更新应用程序信息后我遇到

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 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);
                    }
                }

看截图: enter image description here enter image description here enter image description here

c# sql-server-2008 nhibernate fluent-nhibernate sqldatetime
2个回答
2
投票

感谢大家的有用评论。

问题是我正在从数据库中获取

device
对象,该对象具有属性
LastActivityDate

List<Device> devices = session.QueryOver<Data.Model.Device>().List().ToList();

在向数据库添加带有一些信息的设备对象后,我已将此属性添加到模型中。 该属性为 null,但我没有将 LastActivityDate 定义为可为 null 的属性。

因此该对象位于应用程序对象的同一会话中。当我刷新会话时,因为

LastActivityDate
为空,所以出现了SqlDateTime异常!

很简单。但我花了好几个小时才找到它!!


0
投票

如果您遇到此问题,请按照以下步骤解决:

  • 如果您保存 A 类的实例,并不一定意味着问题仅存在于该类中。 Hibernate 管理会话,其中包括该会话中使用的所有实体。可能是其中一个实体导致了该问题。本质上,此错误表明您正在尝试将空值传递到非空日期字段。
© www.soinside.com 2019 - 2024. All rights reserved.