我使用.NET的类 Transaction
进行编码,在此特定方法中,我只希望重新实例化 Transaction
实例已经不实例化了。下面是一些与一些Entity Framework方法一起完成的示例。
if (Transaction.Current != null)
{
using (var transaction = CreateTransaction())
{
_dbSet.Attach(item);
_dbSet.Remove(item);
_context.SaveChanges();
transaction.Complete();
}
}
else
{
_dbSet.Attach(item);
_dbSet.Remove(item);
_context.SaveChanges();
}
我想知道如果上述条件成立,是否有更聪明的方法只使用using
- 行。我不喜欢两次重复相同的代码。
答案 0 :(得分:0)
为什么不创建一个新的事务范围(如果已经存在的话)?
但是,如果新的交易没有意义,那么最好的办法就是返回虚拟IDisposable
。
答案 1 :(得分:0)
// Check if a transaction already exists. if one doesn't create one for
// the purpose of the following changes
Transaction transaction = Transaction.Current == null
? CreateTransaction()
: null;
// changes
_dbSet.Attach(item);
_dbSet.Remove(item);
_context.SaveChanges();
// if we did end up creating one, let's clean up after it.
if (transaction != null)
{
transaction.Complete();
transaction.Dispose();
}
也许是这样的? (虽然这可能是CodeReview的更好问题)
答案 2 :(得分:0)
从技术上讲,你可以写这样的东西(因为如果transaction
是null
,using
不会发生自动处理,请参阅http://msdn.microsoft.com/en-us//library/yh598w02.aspx) :
using (var transaction = Transaction.Current == null ? CreateTransaction() : null)
{
_dbSet.Attach(item);
_dbSet.Remove(item);
_context.SaveChanges();
if(transaction != null)
transaction.Complete();
}
(我不确定支票。在原始代码Transaction.Current != null
中,Transaction.Current == null
看起来更符合逻辑。)
但我会考虑分组
_dbSet.Attach(item);
_dbSet.Remove(item);
_context.SaveChanges();
进入一个单独的功能。