エンティティフレームワーク4.0がDTMを使用する必要があるのはなぜですか?使用しないことは可能ですか?

StackOverflow https://stackoverflow.com/questions/4076868

質問

私はほぼ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がこのサービスを使用してトランザクションを作成する理由を知りたいのですが、Plane SQLスクリプトは「Begin Tran」、「Save Tran」、「Rollback Tran」などのいくつかのステートメントのみを使用できます。

私の非常に簡単なトランザクションステートメントのためにDTMサービスを呼び出すことを避ける他の方法はありますか?

詩現在の作業データベースは非常に小さく、さまざまなトランザクションテクニックから影響を与えるべきではないと思います。

ありがとう、

役に立ちましたか?

解決

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

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);
}

ありがとう キム・メジャー 次の質問に答えるため。メインMSDN Webサイトを含むエンティティトランザクションを使用することを明確に提案する他のページを見つけることができません(方法:エンティティフレームワークでトランザクションを管理します).

エンティティフレームワークでトランザクションを使用する方法は?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top