gpt4 book ai didi

sql-server - NHibernate 不会持久化 DateTime SqlDateTime 溢出

转载 作者:行者123 更新时间:2023-12-02 21:38:41 25 4
gpt4 key购买 nike

我正在开发一个以 NHibernate 作为后端的 ASP.NET MVC 项目,但在将一些日期写回到我的 SQL Server 数据库表中时遇到一些问题。

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

基本上,当我尝试保存具有 DateAdded 和 LastUpdated 字段的实体时,我收到 SqlDateTime 溢出异常。我过去遇到过类似的问题,我试图将日期时间字段写入小日期时间列,更新列上的类型似乎可以解决问题。我的直觉是,这将是表定义或某种类型的不兼容数据类型的问题,并且溢出异常有点糟糕。

我附上了表定义的示例以及 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,这就是 session 所记住的内容。当 NHibernate 重新水化对象时,日期将设置为值 DateTime.MinValue。当 session 与数据库同步时,NHibernate 假设某些内容发生了变化,因为 currentState 和 previousState 不同,并尝试更新该行。这又会失败,因为 DateTime.MinValue 不适合 SqlServer 日期时间列。

解决方案:通过放置 ? 使您的日期时间可以为空在日期时间末尾,例如 DateTime?Nullable

完整文章可在以下位置找到:nhibernate-sqldatetime-overflow-issue

关于sql-server - NHibernate 不会持久化 DateTime SqlDateTime 溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/645399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com