2013-11-01 39 views
0

我在一個單一的,遺留的數據庫之上有一個NHibernate映射,並且自從我們在生產中推出以來,我們每天大約4-8次地從NHibernate中零星地獲取錯誤,每天處理大約60 000個事件,所以錯誤頻率約爲0.006% - 0.013%)。在NHibernate中,Native生成的值類型標識符可以爲null嗎?

據我和我的同事們已經能夠確定,沒有什麼是這些失敗的事件/消息與成功的事件不同。

我們得到的錯誤是

NHibernate.AssertionFailure: null identifier 
at NHibernate.Engine.EntityKey..ctor(Object identifier, String rootEntityName, String entityName, IType identifierType, Boolean batchLoadable, ISessionFactoryImplementor factory, EntityMode entityMode) 
at NHibernate.Engine.EntityKey..ctor(Object id, IEntityPersister persister, EntityMode entityMode) 
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) 
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) 
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) 
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) 
at NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) 
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event) 
at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) 
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) 
at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event) 
at NHibernate.Impl.SessionImpl.Save(Object obj) 

但標識列是值類型(System.Int32),使用本地發電機。 它怎麼能是空的?

public class MyItem { 
    public int MyItemId { get; set; } 
} 

public class MyItemMap : ClassMapping<MyItem> 
{ 
    public MyItemMap() 
    { 
     Table("MyItemTable"); 

     Id(m => m.MyItemId, x => 
     { 
      x.Column("MyItem_ID"); 
      x.Generator(Generators.Native); 
      x.UnsavedValue(default(int)); 
     }); 
    } 
} 

所以,我的問題是真的; a)爲什麼當標識符是一個值類型(即不可空)時,NHibernate會抱怨空標識符? b)有什麼我可以做的嗎?

+1

你使用了什麼樣的數據庫?本機生成器選擇了什麼? – MichaC

+0

和什麼版本的NHibernate? –

+0

你可以看看/張貼由NHibernate生成的插入語句嗎? – Firo

回答

0

我能夠隔離並重現問題。

問題表(MyItemTable)有一個IGNORE_DUP_KEY = ON的索引。

由於另一個問題,我們試圖插入一個接近相同的行兩次。 第二次插入失敗並出現警告,並且實際上沒有插入行。 所以當NHibernate試圖獲得生成的身份時,SQL Server可能會返回NULL,因爲沒有記錄被插入。

之所以沒有在任何測試中出現,是因爲數據庫從一開始就沒有通過工具進行版本控制,而是通過手動遷移。另外,當我們的數據庫版本管理工具對傳統數據庫進行腳本編寫時,索引不包括在內。 因此在爲集成測試生成的測試環境/數據庫中缺少該索引。 單片遺留問題的難點...

相關問題