我没有任何想法,为什么保存新记录这样简单的事情会导致NHibernate失败。
所以我有一个班级:
public class TimeSlot
{
public virtual int TimeSlotId { get; set; }
public virtual int TimeProfileId { get; set; }
public virtual DateTime StartTime { get; set; }
public virtual DateTime EndTime { get; set; }
public virtual int ParkingDisabled { get; set; }
public virtual int DayOfWeek { get; set; }
}
然后我有一个映射类:
public class TimeSlotMap : ClassMap<TimeSlot>
{
public TimeSlotMap()
{
Table("TimeSlot");
Id(x => x.TimeSlotId, "TimeSlotId").GeneratedBy.Identity();
Map(x => x.TimeProfileId, "TimeProfileId");
Map(x => x.StartTime, "StartTime").CustomType<UtcDateTimeType>().Not.Nullable();
Map(x => x.EndTime, "EndTime").CustomType<UtcDateTimeType>().Not.Nullable();
Map(x => x.ParkingDisabled, "ParkingDisabled");
Map(x => x.DayOfWeek, "DayOfWeek");
}
}
在定义Id时,我尝试使用没有.GeneratedBy.Identity(),有或没有.UnsavedValue(0)但是在尝试保存新的TimeSlot实例时没有任何东西阻止NHibernate抛出以下异常。 (保存,SaveOrUpdate,它们都抛出此异常)。
保存新的TimeSlot TimeSlotId为0时,其余属性具有有效值。
例外是: {&#34;无法插入:[***。Entities.Models.ParkingRestriction] [SQL:INSERT INTO TimeSlot(TimeProfileId,StartTime,EndTime,ParkingDisabled,DayOfWeek)VALUES(?,?,?,?,?);选择SCOPE_IDENTITY()]&#34;}
内部异常说了很多: &#34;违反PRIMARY KEY约束&#39; TimeSlot_PK&#39;。无法在对象&#39; dbo.TimeSlot&#39;中插入重复键。重复键值为(13)。\ r \ n语句已终止。&#34;
当然它有一个TimeSlotId = 13的记录,甚至在应用程序启动之前它就在数据库中。 以某种方式NHibernate试图猜测&#39;下一个可用的ID,但它不正确。
问题: 是否可以强制NHibernate插入新记录而不指定ID,以便SQL自己分配?这应该是默认行为。
在这里,您将找到TimeSlot表的SQL定义:
CREATE TABLE [dbo].[TimeSlot](
[TimeSlotId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[TimeProfileId] [int] NOT NULL,
[DayOfWeek] [tinyint] NOT NULL,
[StartTime] [datetime] NOT NULL,
[EndTime] [datetime] NOT NULL,
[ParkingDisabled] [bit] NOT NULL,
CONSTRAINT [TimeSlot_PK] PRIMARY KEY CLUSTERED
(
[TimeSlotId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TimeSlot] WITH CHECK ADD CONSTRAINT [TimeProfile_TimeSlot_FK1] FOREIGN KEY([TimeProfileId])
REFERENCES [dbo].[TimeProfile] ([TimeProfileId])
GO
ALTER TABLE [dbo].[TimeSlot] CHECK CONSTRAINT [TimeProfile_TimeSlot_FK1]
GO
谢谢,拉德克
更新 我检查过探查器。 SQL INSERT语句不包含标识列。执行以下语句: &#34; exec sp_executesql N&#39; INSERT INTO TimeSlot(TimeProfileId,StartTime,EndTime,ParkingDisabled,DayOfWeek)VALUES(@ p0,@ p1,@ p2,@ p3,@ p4);选择SCOPE_IDENTITY()&#39;,N&#39; @ p0 int,@ p1 datetime,@ p2 datetime,@ p3 int,@ p4 int&#39;,@ p0 = 2,@ p1 =&#39; 1970- 01-01 09:30:00&#39;,@ p2 =&#39; 1970-01-01 18:30:00&#39;,@ p3 = 0,@ p4 = 6&#34;。 从应用程序级别执行时失败。从SQL Management studio执行时,它会成功。 在这次调用之前看起来似乎有些东西会搞砸会话状态。只是我的猜测。