2016-11-22 75 views
1

考慮下面的代碼: -NHibernate如何更新實體中新插入的ID?

public T Save<T>(T instance) where T : class 
{ 
    using(ISession.BeginTransaction()) 
    { 
     ISession.Save(instance); 
     ISession.Transaction.Commit(); 
     ISession.Refresh(instance); 
     return instance; 
    } 
} 

如何NHibernate填滿ID財產與新生成的ID不論數據庫和數據類型的?最初,我認爲它一定是使用類似的方式,我們手動執行,如MS SQL Server的@@IdentitySCOPE_IDENTITY以及其他數據庫的相對查詢。但這不適用於所有數據類型,如GUID

當我打電話給ISession.Refresh(instance);時,我得到新插入的id在instance對象中。這不是問題,只是想了解如何NHibernate這樣做。

+0

它取決於id生成器。每個生成器都會以不同的方式執行(https://github.com/nhibernate/nhibernate-core/tree/master/src/NHibernate/Id)。例如,如果你深入研究'MsSql2000Dialect',你會發現這行:'return「select SCOPE_IDENTITY()」;'。不管代是什麼,你都不需要刷新對象來獲得它的id。 –

+0

謝謝@A_J。完成。 –

回答

0

它取決於id生成器。每generator將做不同。

例如,如果你深入研究MsSql2000Dialect,你會發現這條線:

return "select SCOPE_IDENTITY()"; 

不管一代的,你不應該需要刷新的對象能夠得到它的ID。

因此,此代碼:

using(ISession.BeginTransaction()) 
{ 
    ISession.Save(instance); 
    ISession.Transaction.Commit(); 
    ISession.Refresh(instance); 
    return instance; 
} 

將變成:

using(ISession.BeginTransaction()) 
{ 
    ISession.Save(instance); 
    ISession.Transaction.Commit(); 

    return instance; 
} 

instance將有一個ID,這不是等於其unsaved-value

0

你到底在找什麼?

您可以準確定義如何在映射中使用ID。這與數據類型或數據庫無關。例如,您不能使用Oracle的身份生成器或非Guid ID的GuidComb。

下面是使用映射的示例由代碼

 Id(x => x.Id, map => 
     { 
      map.Column("Id"); 
      map.Generator(Generators.GuidComb); 
     }); 

參見NHibernate documentation第5.1.5.1。發電機

+0

SQL Server在SQL Server 2012中引入了序列,最早支持的版本是 –

+0

。我會更新答案。 – Fran