2012-07-08 85 views
0

我有一個場景,我有一個圖像屬性是產品實體的一部分。實體框架告訴上下文實體已更新

<div class="editor-label">Image</div> 
    <div class="editor-field"> 
     @if (Model.ProductItem.ImageData == null) 
     { 
     @:None 
     } 
     else 
     { 
      <img alt="Product Image" width="125" height="125" 
      src="@Url.Action("GetImage", "Product", new { Model.ProductItem.ProductId  })" /> 
     } 
    </div> 

    <div>Upload new image: <input type="file" name="Image" /></div> 

要編輯的當前圖像的用戶選擇基本上通過上載一個新的:

允許用戶經由MVC3屏幕編輯本產品時,如下所述圖像屬性被顯示。這意味着當前ImageData屬性爲null,模型狀態無效。新圖像過去在後,所以我將其設置爲ImageData屬性並清除模型驗證錯誤。

然後我通過context.savechanges()方法保存'更改',但是上下文不認爲這個特定實體有任何改變。爲了避開這個我已經做了,當上編輯如下:

 if (context.Products.Local.Count() == 0) 
      { 
       Product procurr = context.Products 
        .Where(p => p.ProductId == product.ProductId) 
        .FirstOrDefault(); 

       context.Entry(procurr).CurrentValues.SetValues(product);  
      } 

從本質上講,我強迫一個更新的項目中,我想updqate產品清單(procurr是在列表中的項目和產品我想要保存的新的編輯值)

我的問題是(A)這是使用上下文來做到這一點的最好方法,(B)是否有更好的方式在UI中做到這一點即將新舊圖像綁定在一起,以便模型自動獲取更改?

謝謝

回答

0

你做了什麼看起來正確。

其基本思想是,當您從服務器獲取數據並將其返回給瀏覽器時,您正在使用的EF上下文會關閉。

當答覆從瀏覽器返回時,您需要將數據與您嘗試更新的行連接起來。

基於id讀取行,更新相關字段然後運行保存更改是一種好方法。