我差不多一年前使用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。目前的工作数据库非常小,我认为它不应该受到不同交易技术的影响。
谢谢,
答案 0 :(得分:2)
在我搜索了很多网站后,我发现我可以使用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网站(How to: Manage Transactions in the Entity Framework)。