22

ID を持つテーブルの場合:

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

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

例えば:

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

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

Id = (int)db.GetLastInsertId();

ただし、これが安全な呼び出しになるとは思いません。数百の挿入が同時に発生している場合、別の挿入の ID が返されることがあります。EF では、挿入時に Id が設定されます。

これについて最善の方法を知っている人はいますか?

4

3 に答える 3

29

デフォルトでパラメーター化されたクエリを使用するServiceStack.OrmLite v4にはdb.Save()、AutoIncrement Id を自動的に入力するオプションがいくつかあります。

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

それ以外の場合は、次を使用して最後の挿入 ID を選択できます。

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

OrmLiteの新しい API の.


OrmLite v3の場合

正しい呼び出しはdb.GetLastInsertId()、たとえば内部で SQL Server が呼び出すSELECT SCOPE_IDENTITY()で、その接続に最後に挿入された ID を返します。

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

于 2013-01-14T13:13:54.090 に答える
2

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

var UserId = db.Insert<User>(new User(), selectIdentity: true);
于 2014-04-29T19:55:39.117 に答える
2

Unit of Work パターンを確実に使用する必要があります。特にこのシナリオでは、データベース関連のコードをトランザクション スコープにラップします。

ormLite では、IDbCommand と IDbTransaction を介してこれを実装できます (ここで例を参照してください http://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.OrmLite/ServiceStack.OrmLite.Tests/ShippersExample.cs )

コードを見ると、魔法が少なくなり、手作業によるコーディングが多くなることがわかりますが、これは 1 つの方法です。

于 2013-01-14T12:58:44.117 に答える