NHibernate不会持续DateTime SqlDateTime溢出

我正在开发一个NHibernate作为后端的ASP.NET MVC项目,并且在写回到我的SQL Server数据库表中时遇到了一些麻烦。

这些日期字段不是空的,所以许多关于如何设置可空日期时间的答案没有帮助。

基本上,当我尝试保存具有DateAdded和LastUpdated字段的实体时,我收到了SqlDateTime溢出异常。 在过去,我曾经遇到过类似的问题,那就是我正在尝试将日期时间字段写入smalldatetime列,更新列上的类型似乎可以解决问题。 我的直觉是它会对表定义或某种类型的不兼容数据类型造成一些问题,并且溢出异常有点麻烦。

我附上了一个NHibernate试图运行的表定义和查询的例子,任何帮助或建议将不胜感激。

CREATE TABLE [dbo].[CustomPages](
    [ID] [uniqueidentifier] NOT NULL,
    [StoreID] [uniqueidentifier] NOT NULL,
    [DateAdded] [datetime] NOT NULL,
    [AddedByID] [uniqueidentifier] NOT NULL,
    [LastUpdated] [datetime] NOT NULL,
    [LastUpdatedByID] [uniqueidentifier] NOT NULL,
    [Title] [nvarchar](150) NOT NULL,
    [Term] [nvarchar](150) NOT NULL,
    [Content] [ntext] NULL
)

exec sp_executesql N'INSERT INTO CustomPages (Title, Term, Content, LastUpdated, DateAdded, StoreID, LastUpdatedById, AddedById, ID) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8)',N'@p0 
nvarchar(21),@p1 nvarchar(21),@p2 nvarchar(33),@p3 datetime,@p4 datetime,@p5 uniqueidentifier,@p6 uniqueidentifier,@p7 uniqueidentifier,@p8 uniqueidentifier',@p0=N'Size and Colour 
Chart',@p1=N'size-and-colour-chart',@p2=N'This is the size and colour chart',@p3=''2009-03-14 14:29:37:000'',@p4=''2009-03-14 
14:29:37:000'',@p5='48315F9F-0E00-4654-A2C0-62FB466E529D',@p6='1480221A-605A-4D72-B0E5-E1FE72C5D43C',@p7='1480221A-605A-4D72-B0E5-E1FE72C5D43C',@p8='1E421F9E-9A00-49CF-9180-DCD22FCE7F55'

作为对答案/评论的回应,我使用Fluent NHibernate,生成的映射如下所示

  public CustomPageMap() {

            WithTable("CustomPages");

            Id( x => x.ID, "ID" )
                .WithUnsavedValue(Guid.Empty)
            .   GeneratedBy.Guid();

            References(x => x.Store, "StoreID");

            Map(x => x.DateAdded, "DateAdded");
            References(x => x.AddedBy, "AddedById");
            Map(x => x.LastUpdated, "LastUpdated");
            References(x => x.LastUpdatedBy, "LastUpdatedById");


            Map(x => x.Title, "Title");
            Map(x => x.Term, "Term");
            Map(x => x.Content, "Content");

        }  

    <?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false" assembly="MyNamespace.Core" namespace="MyNamespace.Core">
<class name="CustomPage" table="CustomPages" xmlns="urn:nhibernate-mapping-2.2">
<id name="ID" column="ID" type="Guid" unsaved-value="00000000-0000-0000-0000-000000000000"><generator class="guid" /></id>
<property name="Title" column="Title" length="100" type="String"><column name="Title" /></property>
<property name="Term" column="Term" length="100" type="String"><column name="Term" /></property>
<property name="Content" column="Content" length="100" type="String"><column name="Content" /></property>
<property name="LastUpdated" column="LastUpdated" type="DateTime"><column name="LastUpdated" /></property>
<property name="DateAdded" column="DateAdded" type="DateTime"><column name="DateAdded" /></property>
<many-to-one name="Store" column="StoreID" /><many-to-one name="LastUpdatedBy" column="LastUpdatedById" />
<many-to-one name="AddedBy" column="AddedById" /></class></hibernate-mapping>

其实背后的原因是:

当NHibernate从数据库中读取行时,该值为null,这就是会话记住的内容。 当对象被NHibernate重新水化时,Date被设置为值DateTime.MinValue。 当Session与数据库同步时,NHibernate会假设某些内容已经改变,因为currentState和previousState不同,并且尝试更新该行。 而这又会失败,因为DateTime.MinValue不适合SqlServer datetime列。

解决方案:让你的日期时间可以通过放置? 在日期时间结束像DateTime?可为空

完整的文章可以在:nhibernate-sqldatetime-overflow-issue找到


我遇到了同一问题表,其中包含不可空的日期时间列和保存时的SqlDateTime溢出。

在我的情况下,实际的问题是保存触发了一个session.flush,它会导致对使用同一个会话加载的某个对象进行更新。 这个对象确实有'datetime字段应该使用可空的日期时间字段'的问题。

换句话说:尝试在保存或更新之前执行session.flush,以检查问题是否可能是由于早期使用同一个会话对象造成的。

希望能帮助任何人。


为什么@ p3和@ p4有2个单引号? 复制并粘贴错误?

我无法检查(这里没有安装SQL),但是毫秒分隔符不是“点”,即“2009-03-14 14:29:37.000”

@ p3是“之前”,@ p4是“之后”这里:

exec sp_executesql
  N'INSERT INTO CustomPages (Title, Term, Content, LastUpdated, DateAdded, StoreID, LastUpdatedById, AddedById, ID)
  VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8)',
  N'@p0 nvarchar(21),@p1 nvarchar(21),@p2 nvarchar(33),@p3 datetime,@p4 datetime,@p5 uniqueidentifier,@p6 uniqueidentifier,@p7 uniqueidentifier,@p8 uniqueidentifier',

    @p0=N'Size and Colour Chart',
    @p1=N'size-and-colour-chart',
    @p2=N'This is the size and colour chart',
    @p3=''2009-03-14 14:29:37:000'', --quotes + dot wrong?
    @p4='2009-03-14 14:29:37.000', --quotes + dot correct?
    @p5='48315F9F-0E00-4654-A2C0-62FB466E529D',
    @p6='1480221A-605A-4D72-B0E5-E1FE72C5D43C',
    @p7='1480221A-605A-4D72-B0E5-E1FE72C5D43C',
    @p8='1E421F9E-9A00-49CF-9180-DCD22FCE7F55'
链接地址: http://www.djcxy.com/p/26959.html

上一篇: NHibernate won't persist DateTime SqlDateTime overflow

下一篇: Writing in the hole of a memory