エンティティフレームワーク4.0がDTMを使用する必要があるのはなぜですか?使用しないことは可能ですか?
-
28-09-2019 - |
質問
私はほぼ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サイトを含むエンティティトランザクションを使用することを明確に提案する他のページを見つけることができません(方法:エンティティフレームワークでトランザクションを管理します).
所属していません StackOverflow