2013-10-28 42 views
3

在BLLEF Repository模式 - 更新邏輯

public void Update(Product product) 
{ 
    if (repository.GetProductById(product.ID) != null) 
    { 
     repository.Update(product); 
    } 
else 
    { 
    // Display errorrs 
    } 
} 

在庫

public void UpdateProduct(Product product) 

{ 

_dbContext.Entry(product).State = EntityState.Modified; 

_dbContext.SaveChanges(); 

} 



public Product GetProductById(int id) 

{ 

return _dbContext.Products.Find(id); 

} 

當我運行的網站,它表明這個錯誤

「具有相同鍵的對象已存在在ObjectStateManager中,ObjectStateManager不能使用相同的密鑰跟蹤多個對象。「

我知道發生了什麼事。當我調用GetProductByID()附加到DbContext的產品實體時。所以當我調用Update()時,它將複製Product實體。因爲在Update()中,我在DbContext中附加了存在的實體。

解決它。我只調用Update()。但是我想在更新/刪除它之前檢查產品的存在。

通過您的設計經驗,如何通過一個很好的方式來傳遞這個問題?

回答

0

您可以在數據庫中查詢的斷開實體是這樣的:如果你設置你的背景下AsNoTracking

public bool ProductExists(int id) 
{ 
    return _dbContext.Products.Any(o => o.Id == id); 
} 
0

public Product GetProductById(int id) 
{ 
    return _dbContext.Products.AsNoTracking().SingleOrDefault(o => o.Id == id); 
} 

或者你可以做一個檢查像這樣在你的代碼的其他地方()這將停止aspmvc跟蹤對內存中實體的更改(這正是您想要的任何內容)。

_dbContext.Products.AsNoTracking().Find(id); 

我會建議你在http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for-an-mvc-web-application

閱讀更多關於這個佳日