关键字'使用'仅在条件成立时才使用

时间:2014-03-01 22:04:41

标签: c# dry

我使用.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 - 行。我不喜欢两次重复相同的代码。

3 个答案:

答案 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)

从技术上讲,你可以写这样的东西(因为如果transactionnullusing不会发生自动处理,请参阅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();

进入一个单独的功能。