1

私はほぼ1年前にEFを使用しています。次のコードのような非常に複雑なクエリでTransactionScope取引を使用しようとしています。

using (var tran = new TransactionScope())
{
    // Clear all data in some table
    DataContext.SomeTables
        .ForEach(x => DataContext.SomeTables.DeleteObject(x));

    DataContext.SaveChanges();

    // Import data from excel as DataSet object.
    var ds = ImportDataFromExcel(file.FullName);

    foreach (DataRow dr in ds.Tables[0].Rows)
    {
        DataContext.SomeTables.AddObject(new SomeTable
        {
            // fill object with data from current row.
        });
    }

    DataContext.SaveChanges();

    // Commit Transaction
    tran.Complete();
}

その後、DTM が有効になっていない、またはアクセスできないというエラーが表示されました。データベースサーバーのこのサービスが開始されていないか、ファイアウォールによってブロックされていることが原因であることはわかっています。しかし、それは私の主張ではありません。

EF がこのサービスを使用してトランザクションを作成する理由を知りたいのですが、プレーン SQL スクリプトは「BEGIN TRAN」、「SAVE TRAN」、「ROLLBACK TRAN」などのステートメントしか使用できません。

非常に単純なトランザクション ステートメントに対して DTM サービスを呼び出さないようにする他の方法はありますか?

PS。現在の作業データベースは非常に小さいので、異なるトランザクション技術の影響を受けるべきではないと思います。

ありがとう、

4

1 に答える 1

2

多くの Web サイトを検索した結果、次のソース コードのように Entity トランザクションを使用してトランザクションを手動で作成できることがわかりました。

using (var tran = DataContext.BeginTransaction())
{
    // Clear all data in some table
    DataContext.SomeTables
        .ForEach(x => DataContext.SomeTables.DeleteObject(x));

    DataContext.SaveChanges();

    // Import data from excel as DataSet object.
    var ds = ImportDataFromExcel(file.FullName);

    foreach (DataRow dr in ds.Tables[0].Rows)
    {
        DataContext.SomeTables.AddObject(new SomeTable
        {
            // fill object with data from current row.
        });
    }

    DataContext.SaveChanges();

    // Commit Transaction
    tran.Commit();
}

ヘルパー クラス

public static DbTransaction BeginTransaction(this ObjectContext context, IsolationLevel isolationLevel = IsolationLevel.ReadCommitted)
{
    if (context.Connection.State != ConnectionState.Open)
    {
        context.Connection.Open();
    }

    return context.Connection.BeginTransaction(isolationLevel);
}

次の質問に答えてくれたKim Majorに感謝します。メインの MSDN Web サイト (方法: エンティティ フレームワークでトランザクションを管理する)を含むエンティティ トランザクションの使用を明確に示唆している他のページが見つかりません。

Entity Framework でトランザクションを使用する方法は?

于 2010-11-02T11:10:06.363 に答える