2014-03-01 19 views
0

我帶班Transaction爲.NET編碼,並在這個具體的方法我只想重新實例Transaction來說,如果它是不已經實例。下面是一些與一些實體框架方法一起完成的示例。關鍵字「使用」只有當條件成立

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

你是不是指'if(Transaction.Current == null)'(而不是'!=')? – AlexD

回答

0

從技術上講,你可以寫這樣的事情(因爲如果transactionnull,無自動處置會發生由於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(); 

成一個單獨的函數。

0

爲什麼不只是創建一個新的事務範圍,如果一個已經存在的現有範圍內?

但是,如果新的交易沒有意義,最好的做法可能只是返回一個虛擬IDisposable

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(); 
} 

也許這樣的事情? (雖然這可能是代碼審查一個更好的問題)