我有一个名为“ABC”的实体框架实体(属性ID和标题)。
在更新记录视图中,我已将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 :(得分: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);