2012-01-21 94 views
0

我在我的解決方案中使用CastleProject和MySQL的ActiveRecord。我想檢索最後插入的ID,所以我做了這樣的事情:如何檢索Castle ActiveRecord中的最後一個插入ID?

[ActiveRecord] 
public class UserDb : ActiveRecordBase<UserDb> 
{ 
    [PrimaryKey] 
    public uint Id { get; set; } 

    [Property] 
    public int OtherStuff { get; set; } 
} 

public void Blablabla() 
{ 
    UserDb user = new UserDb(); 
    user.OtherStuff = 123; 
    user.CreateAndFlush(); 

    Console.WriteLine(user.Id); 
} 

有時,它輸出正確的ID,但有時,它只是輸出0 我錯過了什麼?

注意:我這樣做的原因是因爲我們有幾臺服務器同時連接到同一個數據庫,並且我想要一個唯一的id生成器。爲了獨特,我的意思是在這些服務器中獨一無二如果有其他解決方案可以在幾臺服務器中維護一個獨特的ID生成器,我將非常感激。

謝謝你們!

回答

0

如果您想要在多個服務器中擁有唯一的ID,那麼可以考慮使用GUID而不是int。但是,如果你只是試圖讓你剛插入的項目的ID,你可以只用user.Refresh()

+0

我試過使用'user.Refresh()',但是,我仍然有時爲'user.Id'取0。 –

0

Castel.ActiveRecord(或更好NHibernate的)刷新它爲您提供了多種選擇生成主鍵,你應該看看PrimaryKeyType-Enum。

GUID是最簡單的一個,不需要任何東西就可以使System.Guid類型的primary-key-Property和數據庫中的列進行調整。 (我不知道你在數據庫中需要什麼類型,我總是使用VARCHAR/CHAR/etc。)

如果你想保留你現在使用的uint,那麼我會建議使用HiLo。

[PrimaryKey(Generator=PrimaryKeyType.HiLo)] 
public virtual uint Id{get;set;} 

在數據庫:

CREATE TABLE hibernate_unique_key(next_hi NUMERIC(18, 0)); 
INSERT INTO hibernate_unique_key VALUES(1); 
-- script from ms-sql-express, I am not sure if there is a difference for mysql 

問候 Juy Juka

0

我已經咬傷了同樣的問題。然而,我的問題越來越大,我發現什麼似乎是真正的問題; nHibernate不支持線程。我假設你的代碼是多線程的,如果是這樣的話,你需要在其他線程中使用'使用(新的SessionScope())'塊來訪問數據庫。

在我的情況下,Castle會在保存後從其他表中返回ID,這真的讓我發瘋。