2014-04-08 129 views
0

尋求最佳實踐建議實體框架單行CRUD

很多時候我必須對我的ASP.NET應用程序中的單個記錄執行CRUD操作。

刪除,我是做像

var myRecord = context.myTable.Find(myID); 
if (myRecord != null) 
{ 
    context.myTable.Remove(myRecord); 
    context.SaveChanges(); 
} 

約做這樣

new context().myTable.Find(myID).Remove(); 

閱讀一些EF和存儲庫模式的工作人員(尤其是Here)後的思考,我與通用庫的幫助下理解,至少我可以這樣做:

class UnitOfWork 
{ 
    void RemoveRecord(myRecord) 
    { 
     var context = FindMyContext(myRecord); //[here](http://blogs.msdn.com/b/alexj/archive/2009/06/08/tip-24-how-to-get-the-objectcontext-from-an-entity.aspx) 
     context.Entry(myRecord).State = EntityState.Deleted; 
     context.SaveChanges(); 
    } 
} 

我可以使用它像我的代碼:

new UnitOfWork.RemoveRecord(myRecord); 

這是個好主意嗎?

+0

一個問題是我可能不想執行context.SaveChanges這裏,因爲可能有其他事情正在進行此上下文,不應保存 – Yiping

+1

看看[this](https:// www。 youtube.com/watch?v=QwwfTWMrM9k),它幫助我瞭解了工作單元主題。關於這一點的是,你是否真的需要做額外的工作,所有這一切取決於你正在從事的項目有多大。 – GregoryHouseMD

+0

如果我正確地理解了這個問題,您可能需要考慮使用TransactionScope來控制更新http://msdn.microsoft.com/en-us/library/vstudio/bb738523(v=vs.100).aspx – Haroon

回答

2

首先問自己,實體框架之上的存儲庫和工作單元模式的附加價值是什麼?

實體框架的背景下已經工作的單位和已經一個倉庫,何必再創建一個嗎?

此外,您應該從您需要的時刻創建一個上下文,並儘快進行處理。您的服務操作可能如下所示:

public void RemoveCustomer(int customerId) 
{ 
     using(var context = new MyDbContext()) 
     { 
      var customer = context.Customers.SingleOrDefault(c => c.Id == customerId); 
      if (customer==null) throw new BusinessException("Customer does not exist"); 
      context.Customers.Remove(customer);  
      context.SaveChanges(); 
     } 
} 

我個人上使用IoC框架(如使用StructureMap)注入此上下文。