我制訂類似下面的類:CompositeId和IDENTITY_INSERT
public class FooMap : ClassMap<Foo>
{
public FooMap()
{
Table("Foo");
LazyLoad();
CompositeId().KeyProperty(x => x.ID,
kp => kp.ColumnName("Id")
.Type(typeof(long)))
.KeyProperty(x => x.ValidFrom);
}
}
在MSSQL側,編號爲標識列和表的PK是由Id
和ValidFrom
。
這裏是我用來保存代碼:
ISession session = SessionService.GetSession();
new SqlCommand("SET IDENTITY_INSERT Foo ON",
session.Connection as SqlConnection)
.ExecuteNonQuery();
try
{
// performs various versioning checks,
// then saves using transaction.
// The session is the same as above
GenericDataService.Save(myFoo);
}
finally
{
new SqlCommand("SET IDENTITY_INSERT Foo OFF",
session.Connection as SqlConnection)
.ExecuteNonQuery();
}
雖然我設置Identity_Insert
到ON
,我得到下面的異常(保持ID
時和設置新ValidFrom
):
Cannot insert explicit value for identity column in table 'Foo' when IDENTITY_INSERT is set to OFF.
這是執行的SQL:
INSERT INTO Foo (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, Id, ValidFrom)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
任何人都可以解釋爲什麼我仍然得到這個異常?
是錯誤數據庫錯誤或NHibernate的錯誤?只是猜測,但我認爲'Set Identity_Insert Foo on'可能不會作爲同一事務的一部分運行。嘗試使用SQL Profiler查看數據庫實際執行的內容 –
感謝Nathan - 根據您的說法和我的代碼(它說「//使用事務保存」的部分)來判斷,這可能只是案件。我會在這裏檢查並回復... –