实体框架告诉上下文实体已更新

时间:2012-07-08 12:21:46

标签: asp.net-mvc-3 entity-framework

我有一个场景,我有一个图像属性,它是产品实体的一部分。

当允许用户通过MVC3屏幕编辑此产品时,image属性显示如下:

<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>

要编辑当前图像,用户实际上是通过上传选择新图像。这意味着当前的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);    
            }

基本上我正在强制更新我想要更新的产品列表中的项目(procurr是列表中的项目,product是我要保存的新编辑值)

我的问题是(A)这是在使用上下文方面做到这一点的最好方法吗?(B)是否有更好的方法在UI中执行此操作,即将新旧图像捆绑在一起所以模型会自动获取变化吗?

由于

1 个答案:

答案 0 :(得分:0)

你所做的一切看起来是正确的。

基本思想是,当您从服务器获取数据并将其返回到浏览器时,您使用的EF上下文将被关闭。

当回复从浏览器返回时,您需要将数据与您尝试更新的行连接。

根据id读取行,更新相关字段然后运行保存更改,是一种很好的方法。