【发布时间】:2009-03-14 04:49:28
【问题描述】:
我正在开发一个以 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'
为了响应答案/cmets,我使用 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>
【问题讨论】:
-
您的表和 SQL 似乎没问题。如果您尝试手动运行该 SQL 查询,它是否有效?可能值得在这里发布代码和休眠映射文件
-
是的,查询在 SQL 查询分析器中运行正常,除了我必须将日期时间周围的双单引号(作为 utc 样式字符串)更改为单引号,此查询由 nhibernate 生成
标签: sql-server nhibernate datetime