当前位置:  开发笔记 > 后端 > 正文

NHibernate不会持久化DateTime SqlDateTime溢出

如何解决《NHibernate不会持久化DateTimeSqlDateTime溢出》经验,为你挑选了1个好方法。

我正在使用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");

        }  

    










小智.. 17

实际上幕后的原因是:

当NHibernate从db读取行时,该值为null,这就是会话记住的内容.当对象由NHibernate重新水合时,Date被设置为DateTime.MinValue值.当Session与db同步时,NHibernate会假定某些内容已发生变化,因为currentState和previousState不同并尝试更新该行.这反过来又失败了,因为DateTime.MinValue不适合SqlServer日期时间列.

解决方案: 通过放置使你的日期时间可以为空?像DateTime一样在Datetime结束或者Nullable

complet文章可以在:nhibernate-sqldatetime-overflow-issue找到



1> 小智..:

实际上幕后的原因是:

当NHibernate从db读取行时,该值为null,这就是会话记住的内容.当对象由NHibernate重新水合时,Date被设置为DateTime.MinValue值.当Session与db同步时,NHibernate会假定某些内容已发生变化,因为currentState和previousState不同并尝试更新该行.这反过来又失败了,因为DateTime.MinValue不适合SqlServer日期时间列.

解决方案: 通过放置使你的日期时间可以为空?像DateTime一样在Datetime结束或者Nullable

complet文章可以在:nhibernate-sqldatetime-overflow-issue找到

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有