1. ホーム
  2. c#

Entity Framework - トランザクション内の'SaveChanges'の前にIDを取得する。

2023-07-20 19:51:55

質問

Entity Framework では - 'SaveChanges' を呼び出す前に、トランザクション内で新しく作成された ID (identity) を取得する方法はありますか?

私は2番目の挿入のためにIDを必要とします、しかしそれは常に0として返されます...。

        ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;

        objectContext.Connection.Open();

        using (var transaction = objectContext.Connection.BeginTransaction())
        {
            foreach (tblTest entity in saveItems)
            {
                this.context.Entry(entity).State = System.Data.EntityState.Added;
                this.context.Set<tblTest>().Add(entity);

                int testId = entity.TestID;

                .... Add another item using testId
            }

            try
            {
                context.SaveChanges();
                transaction.Commit();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                objectContext.Connection.Close();
                throw ex;
            }
        }

        objectContext.Connection.Close();

どのように解決するのですか?

ID は、行がテーブルに挿入された後にデータベースによって生成されます。行が挿入される前に、その値がどうなるかをデータベースに問い合わせることはできません。

これを回避する方法は二つあります。最も簡単なのは SaveChanges . トランザクションの中にいるので、IDを取得した後に問題が発生した場合にロールバックすることができます。

2つ目の方法は、データベースに内蔵されている IDENTITY フィールドを使用せず、自分で実装することです。これは、大量の挿入操作がある場合に非常に便利ですが、実装が簡単ではないという代償を伴います。

EDIT: SQL Server 2012 には、IDENTITY 列の代わりに使用できる SEQUENCE 型が組み込まれており、自分でそれを実装する必要はありません。