1

私は2つのテーブルを持っています。最初のテーブルにはいくつかのデータが含まれています。2 番目のテーブルには、データ変更の履歴が含まれています。最初のテーブルには、最後の履歴行を参照する列も含まれています。最初のテーブルの行のデータが変更されている場合、コピーは 2 番目のテーブルに挿入され、最後のデータ コピーへの参照が更新される最初の列に挿入されます。そのために、このコードを使用します

using (TransactionScope trn = new TransactionScope())
{
  Table1 t1=model.Table1.Where(t=>t==id).FirstOrDefault();
  /*update Table1 data*/
  Table2 t2=new Table2();
  t2.Table1=t1;
  model.AddToTable2(t2);
  /*set Table2 fields*/
  model.SaveChanges();

  t1.ref=t2.id;
  model.SaveChanges();
  trn.Complete();
}

適合データを保存するための TransactionScope の使用は正しいですか? または、他の方法を使用する必要がありますか?

4

2 に答える 2

1

変更を 2 回保存する必要がありますか? テーブルが関連している場合は、ナビゲーション プロパティを設定し、すべての変更を 1 回だけ保存できるはずです。その場合、自分でトランザクションを作成する必要はありません。EF がトランザクションを作成します。変更を 2 回保存する必要がある場合は、TransactionScope でうまくいくはずです。接続が開かれると、トランザクションに登録されます。コード スニペットでは、コンテキストがどのようにインスタンス化されるか、およびトランザクションに到達する前に接続で何が起こるかを示していないため、それが正しいかどうかを判断するのは困難です。

于 2012-11-21T05:56:43.857 に答える
-1

コンテキスト クラスはデフォルトでトランザクションをサポートします。ただし、コンテキスト クラスの新しいインスタンスごとに、新しいトランザクションが作成されます。この新しいトランザクションはネストされたトランザクションであり、関連付けられたコンテキスト クラスで SaveChanges() が呼び出されるとコミットされます。

この場合、TransactionScope も必要ありません。両方の操作の結果を確認するだけで、成功した場合は SaveChanges() メソッドを呼び出すだけです。

TransactionScope は通常、ADO.NET 呼び出しと Entity フレームワークを混在させる場合に必要です。このような場合に TransactionScope を使用する秘訣は、独自のトランザクションで使用することをコンテキスト クラスに知らせることです。トランザクションはスコープ内の接続オブジェクトに関連付けられるため、トランザクション スコープに関連付けられている接続でコンテキスト クラスを使用する必要があります。また、呼び出し元のコードが接続を所有しているため、接続を所有できないことをコンテキスト クラスに知らせる必要があります。次のようなことができます。

using (var scope = new TransactionScope(TransactionScopeOption.Required)) 
{ 
    using (var conn = new SqlConnection("...")) 
    { 
        conn.Open(); 

        var sqlCommand = new SqlCommand(); 
        sqlCommand.Connection = conn; 
        sqlCommand.CommandText = 
            @"UPDATE Blogs SET Rating = 5" + 
                " WHERE Name LIKE '%Entity Framework%'"; 
        sqlCommand.ExecuteNonQuery(); 

        using (var context = 
            new BloggingContext(conn, contextOwnsConnection: false)) 
        { 
            var query = context.Posts.Where(p => p.Blog.Rating > 5); 
            foreach (var post in query) 
            { 
                post.Title += "[Cool Blog]"; 
            } 
            context.SaveChanges(); 
        } 
    } 

    scope.Complete(); 
} 

参照: http://msdn.microsoft.com/en-us/data/dn456843.aspx

于 2014-12-09T05:57:23.373 に答える