2012-01-21 16 views
0

CastleProjectのActiveRecordをMySQLと一緒に使用しています。私は、最後のインサート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を使用する場合は、intではなくGUIDを使用することを検討します。しかし、挿入したばかりの項目のIDを取得しようとしているだけの場合は、user.Refresh()

+0

私は 'user.Refresh()'を使ってみましたが、 'user.Id'にはまだ0が残ることがあります。 –

0

でCastel.ActiveRecord(またはより良いNHibernate)を選択すると、主キーを生成するオプションが複数あります。 PrimaryKeyType-Enumを見てください。

GUIDは、System.Guid型のprimary-key-Propertyを作成してデータベースの列を調整するだけで、最も簡単なものです。 (私はあなたがデータベースに必要とするタイプがわからないので、私はいつもVARCHAR/CHAR /などを使用しています)

あなたは現時点であなたが使用しているuintを保持したいなら、私はHiLoを使うことを提案します。データベースで

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

:私は同じ問題にかましてきた

0

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。しかし、私の問題は成長し、私は本当の問題であると思われるものを見つけました。 nHibernateはスレッドを認識しません。あなたのコードがマルチスレッドであると仮定しているので、他のスレッドでデータベースアクセスのために '(新しいSessionScope())'ブロックを使用する必要があります。

私の場合、キャッスルは保存後に他のテーブルからIDを返すので、それは本当に私を狂ってしまいました。

関連する問題