簡體   English   中英

本機生成的值類型標識符在 NHibernate 中可以為空嗎?

[英]Can Native generated value-type identifier be null in NHibernate?

我在一個單一的、遺留的、數據庫之上有一個 NHibernate 映射,自從我們在生產中推出以來,我們每天大約有 4-8 次從 NHibernate 收到錯誤,每天處理大約 60 000 個事件,所以錯誤頻率約為 0.006% - 0.013%)。

據我和我的同事能夠確定,這些失敗的事件/消息與成功的事件/消息相比沒有什么不同。

我們得到的錯誤是

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),使用 Native 生成​​器。 怎么可能為空?

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) 我能做些什么嗎?

我能夠隔離並重現該問題。

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

由於另一個問題,我們試圖兩次插入幾乎相同的行。 第二次插入失敗並顯示警告,實際上沒有插入任何行。 因此,當 NHibernate 嘗試獲取生成的標識時,由於沒有插入記錄,SQL Server 可能會返回 NULL。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM