2010-01-24 118 views
3

我有一個名爲「ABC」(屬性ID和標題)的實體框架實體。在ASP .NET中編輯和更新實體框架實體MVC

在更新記錄視圖上,我已將ID添加爲隱藏字段,標題是文本框。

控制器看起來像是:

public ActionResult UpdateAction(ABC obj) 

我得到的一切罰款和OBJ公平 - 即標題和ID。

我們更新數據庫中的記錄,我讀了原來的實體:

var original = (from x in base.context.ABC where x.id == obj.id).Single(); 

我們反映原來的變化,我覺得應該做的更新模式:

this.TryUpdateModel(original); 

我得到錯誤:| ...說明列ID不能更改。

The property 'id' is part of the object's key information and cannot be modified. 

我不想手動將屬性分配回原始對象。

另一種方法可以是:

TryUpdateModel(original, new string[] { "Title" }, form.ToValueProvider()); 

可是,我討厭串 - 也,我的對象具有類似於20個屬性:|

有人可以建議一個更好的模式嗎?

RGDS

+0

我想我已經找到了解決辦法@ http://stackoverflow.com/questions/922402/strongly-typed-asp-net-mvc-與-ADO淨實體框架 – effkay 2010-01-24 16:42:32

回答

2
public class ControllerExt : Controller 
{ 
    protected void UpdateModel<TModel>(TModel model, params Expression<Func<TModel, object>>[] property) where TModel : class 
    { 
     var props = new List<string>(property.Length); 
     foreach (var p in property) 
     { 
      var memberExpression = RemoveUnary(p.Body) as MemberExpression; 
      if (memberExpression == null) 
      { 
       throw new NullReferenceException("Can not retrieve info about member of {0}".FormatThis(typeof(TModel).Name)); 
      } 
      props.Add(memberExpression.Member.Name); 
     } 
     this.UpdateModel(model, props.ToArray()); 
    } 

    private static Expression RemoveUnary(Expression body) 
    { 
     var unary = body as UnaryExpression; 
     if (unary != null) 
     { 
      return unary.Operand; 
     } 
     return body; 
    } 
} 

例子:

UpdateModel<MyModel>(model, x => x.PropertyFromMyModel_1, x => x.PropertyFromMyModel_2);