我正在使用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找到
实际上幕后的原因是:
当NHibernate从db读取行时,该值为null,这就是会话记住的内容.当对象由NHibernate重新水合时,Date被设置为DateTime.MinValue值.当Session与db同步时,NHibernate会假定某些内容已发生变化,因为currentState和previousState不同并尝试更新该行.这反过来又失败了,因为DateTime.MinValue不适合SqlServer日期时间列.
解决方案: 通过放置使你的日期时间可以为空?像DateTime一样在Datetime结束?或者Nullable
complet文章可以在:nhibernate-sqldatetime-overflow-issue找到