2013-01-13 10 views
19

ServiceStack OrmLiteで自動インクリメントIDを取得する方法は?アイデンティティを持つテーブルの場合

[AutoIncrement] 
    public int Id { get; set;} 

データベースに新しい行を挿入すると、オブジェクトのIDを取得するための最良の方法は何ですか?例えば

db.Insert <>(新しいユーザー())。

IDの値は挿入後に0ですが、データベースでは明らかにそうではありません。私が見ることのできる唯一の可能性は、次のとおりです。

Id = (int)db.GetLastInsertId(); 

しかし、これは安全な呼び出しであるとは思いません。同時に100個のインサートが発生した場合は、別のインサートのIDが返されます。 EFでは、挿入するとIdが自動的に設定されます。

誰もがこの問題を克服する最善の方法を知っていますか?

答えて

26

var itemId = db.Insert(item, selectIdentity:true); 

ここにはmore examples showcasing OrmLite's new API'sです。 OrmLite V3

正しいコールについて


例えばボンネットの下SQL Server用その接続の最後の挿入IDを返すSELECT SCOPE_IDENTITY()を呼び出しdb.GetLastInsertId()です。

これは、発生している他のすべての同時挿入が異なるDB接続を使用しているため安全です。他の誰かが同じ接続を使用するには、それを処分してプールに戻す必要があります。

+0

ああ、接続ごとに!今それははるかに理にかなっています。 – Dylan

+0

v3の説明をありがとう! db.GetLastInsertId()は、私の考える隠しメソッドなので、うまくいかないようです。 – theoutlander

2

作業単位パターンを使用する必要があります。特に、このシナリオでは、db関連コードをトランザクションスコープにラップします。

ormLiteでは、あなたは、あなたが、あまり魔法とより手動コーディングになるだろうに気づくでしょうコードを見てみると

(ここhttp://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.OrmLite/ServiceStack.OrmLite.Tests/ShippersExample.cs例を参照)のIDbCommandとIDbTransactionを経由して、これを実装することができますが、それは一つの方法です。

db.Save(item); 
item.Id //populated with the auto-incremented id 

そうでない場合は、使用して、最後のインサートIDを選択することができます。ServiceStack.OrmLite v4のがパラメータ化クエリを使用して、自動的に自動インクリメントイドを移入db.Save()のオプションのカップル、例えばそこであるデフォルト

+0

作業単位について読んで、サンプルソースを参照してください。 – Dylan

2

更新:ServiceStack/ORMLite v4を使用している場合は、hereのように、パラメータ化されたクエリを使用して挿入されたIDを取得する必要があります。例:

var UserId = db.Insert<User>(new User(), selectIdentity: true); 
関連する問題