NHibernate无法保存记录 - PK Id违规

时间:2017-04-13 10:24:52

标签: c# sql-server nhibernate

我没有任何想法,为什么保存新记录这样简单的事情会导致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执行时,它会成功。 在这次调用之前看起来似乎有些东西会搞砸会话状态。只是我的猜测。

0 个答案:

没有答案