C# Database.ExecuteSqlCommandAsync自动提交事务?
我怀疑C# Database.ExecuteSqlCommandAsync自动提交事务?,c#,entity-framework,rawsql,C#,Entity Framework,Rawsql,我怀疑\u context.Database.ExecuteSqlCommandAsync方法是否自动提交事务 我的代码如下所示: using (DatabaseContext _db = new DatabaseContext()) { using(var _transaction = _db.Database.BeginTransaction()) { try { await _db.Database.E
\u context.Database.ExecuteSqlCommandAsync
方法是否自动提交事务
我的代码如下所示:
using (DatabaseContext _db = new DatabaseContext())
{
using(var _transaction = _db.Database.BeginTransaction())
{
try
{
await _db.Database.ExecuteSqlCommandAsync(query, paramsList);
_transaction.Commit();
}
catch(Exception ex)
{
_transaction.Rollback();
throw;
}
}
}
我假设该方法不会自动提交事务,所以我决定手动提交它
是一种良好的做法?还是没有必要这样做?否,您不需要提交ExecuteSqlCommandAsync,但由于它直接写入数据库,EF跟踪的实体可能会过时 要解决此问题,只需处置并重新生成上下文:
using (DatabaseContext _db = new DatabaseContext())
{
await _db.Database.ExecuteSqlCommandAsync(query, paramsList);
}
using (DatabaseContext _db = new DatabaseContext())
{
var itemsJustInserted = _db.Items.ToList(); //should have your modified items
}
不,你不需要
ExecuteSqlCommandAsync(字符串、CancellationToken、对象[])
备注
如果没有现有的本地事务,将使用新事务来执行该命令
如果事务失败也要回滚吗?是的,在using语句的末尾,EF会自动提交或回滚。老实说,我认为它会。当调用从ExecuteSqlCommandAsync返回时,尽管调用了BeginTransaction,Database.CurrentTransaction在调用后仍然为null。