[英]NHibernate Hilo Sequence without NHibernate
我有一個應用程序使用NHibernate將實體保存到數據庫,它使用HiLo生成的NHibernate來創建id。 我有另一個應用程序,我需要將數據保存到同一個表,但是在這個應用程序中,我沒有使用NHibernate。 有沒有一種簡單的方法來使用HiLo而不添加對NHibernate和映射文件的引用?
<id name="EntityId" unsaved-value="0" >
<column name="EntityId" sql-type="int" not-null="true" />
<generator class="hilo">
<param name="table">hibernate_unique_key</param>
<param name="column">next_hi</param>
<param name="max_lo">1000</param>
</generator>
</id>
更新:我創建了一個新方法來獲取下一個id,我相信它具有與NHibernate HiLo序列相同的行為。 我沒有對數據庫進行任何鎖定,因此如果這是我插入的高頻表,則可能是一個問題,但是對於非常低的頻率,可能存在並發問題的可能性很小。 。
/// <summary>
/// Gets the next entity id.
/// </summary>
/// <returns></returns>
public static int GetNextAvailableEntityId()
{
int max_lo = 1000;
int nextHi = DefaultContext.Database.SqlQuery<int>("select next_hi from hibernate_unique_key").Single();
int nextRangeStart = max_lo * nextHi;
int currentMax = DefaultContext.Database.SqlQuery<int>("SELECT MAX(entityid) FROM Entities").Single();
if (currentMax < nextRangeStart)
{
return currentMax + 1;
}
else
{
DefaultContext.Database.ExecuteSqlCommand("update hibernate_unique_key set next_hi = next_hi + 1");
return nextHi;
}
}
如果有疑問,請查看NH的代碼,以確保您正確實現它。
它是這樣的:
您可以為同一進程的所有事務創建一個id生成器的單個實例。 確保您的id生成器是線程安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.