Sql server NHibernate赢得';t persist DateTime SqlDateTime溢出

Sql server NHibernate赢得';t persist DateTime SqlDateTime溢出,sql-server,nhibernate,datetime,Sql Server,Nhibernate,Datetime,我正在进行一个ASP.NET MVC项目,以NHibernate作为后端,在获取一些日期以写回SQL Server数据库表时遇到了一些问题 这些日期字段不可为空,因此这里关于如何设置可为空的日期时间的许多答案都没有帮助 基本上,当我试图保存包含DateAdded和LastUpdated字段的实体时,会出现SqlDateTime溢出异常。我曾经遇到过一个类似的问题,我试图在smalldatetime列中写入一个datetime字段,更新列的类型似乎可以解决这个问题。我的直觉是,表定义或某些类型的不

我正在进行一个ASP.NET MVC项目,以NHibernate作为后端,在获取一些日期以写回SQL Server数据库表时遇到了一些问题

这些日期字段不可为空,因此这里关于如何设置可为空的日期时间的许多答案都没有帮助

基本上,当我试图保存包含DateAdded和LastUpdated字段的实体时,会出现SqlDateTime溢出异常。我曾经遇到过一个类似的问题,我试图在smalldatetime列中写入一个datetime字段,更新列的类型似乎可以解决这个问题。我的直觉是,表定义或某些类型的不兼容数据类型将出现一些问题,而溢出异常有点错误

我附上了一个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>
publiccustompagemap(){
WithTable(“自定义页面”);
Id(x=>x.Id,“Id”)
.WithUnsavedValue(Guid.Empty)
.GeneratedBy.Guid();
引用(x=>x.Store,“StoreID”);
映射(x=>x.DateAdded,“DateAdded”);
参考文献(x=>x.AddedBy,“AddedById”);
映射(x=>x.LastUpdated,“LastUpdated”);
引用(x=>x.LastUpdatedBy,“LastUpdatedById”);
地图(x=>x.标题,“标题”);
Map(x=>x.术语,“术语”);
地图(x=>x.Content,“Content”);
}  

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

我不能检查(这里没有安装SQL),但应该不是“点”,即“2009-03-14 14:29:37.000”

@p3表示“之前”,而@p4表示“之后”:


您问题中的SQL脚本在我的SQL 2005安装中执行得很好(一旦我修复了gbn发现的报价问题)。您的映射看起来也很好。很抱歉帮不上什么忙。

我正在使用s#architecture/fluentnhibernate创建此映射,我已升级到最新版本,它似乎工作正常。

实际上幕后原因是:

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

解决方案: 将日期时间设置为空,方法是:?在日期时间末尾,如Datetime?可为空


完整的文章可以在以下网址找到:

仅供参考,我一直致力于从各种嵌入式数据访问方法将现有应用程序迁移到NHibernate。这个问题很快就出现了,我找到了一个简单的解决方案,可以最大限度地减少对现有功能应用程序代码的影响。因为我们在某些情况下是按层迁移的,所以数据类接口需要尽可能保持稳定。这里的解决方案是继续为公共接口使用DateTime类型,向私有字段类型添加扩展方法,以便在访问器中的私有字段上从MinValue转换为null并返回,并将nHibernate映射到私有字段


JF

我面临着同样的问题,表中有不可为空的datetime列和save上的SqlDateTime溢出

在我的例子中,实际的问题是保存触发了session.flush,这会导致使用同一会话更新先前加载的某些对象。此对象确实存在“应使用可为null的datetime字段的datetime字段”问题

换句话说:在保存或更新之前尝试执行session.flush,以检查问题是否可能是由较早使用同一session对象引起的


希望这对任何人都有帮助。

您的表和SQL似乎没问题。如果您尝试手动运行SQL查询,该查询是否有效?可能值得在此发布代码和hibernate映射文件是的,查询在SQL查询分析器中运行正常,但我必须将日期时间周围的双单引号(作为utc样式字符串)更改为单引号,此查询由nhibernateYes生成,我认为它呈现日期的方式也有点奇怪,不过,它在查询分析器中确实可以工作,只是我必须将双引号替换为单引号。我查看了nhibernate文档的第5章,认为我可以告诉nhibernate如何更正方言,但它看起来不可能。2009-03-14 14 14:29:37:000格式错误,但对于SQL Server来说,方言可能是您的问题。你为什么说这看起来不可能?您是如何创建SessionFactory的?您是从配置文件读取它,还是以编程方式创建它?
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'