您的位置:首页 > 其它

EF指定更新字段,强类型,有提示

2011-10-09 17:39 423 查看
在不同的ObjectContext中,通过Attach的方式更新数据,会默认更新所有字段

可以使用

ObjectStateEntry.SetModifiedProperty("...")来指定更新某些字段

具体可见文章

但是字符串传递的方式不爽,还区分大小写。

可以用MVC提供的ExpressionHelper类解析lambda表达式,获取属性名

1: public static void SetModifiedProperty<TModel, TProperty>(this ObjectStateEntry entry, Expression<Func<TModel, TProperty>> expression)

2: {

3:     entry.SetModifiedProperty(ExpressionHelper.GetExpressionText(expression));

4: }


如果要写通用的EF update操作,传递expression集合,这个时候第二个泛型参数不确定,如果用object的话,对int,bool等类型会进行convert操作。

lambda表达式类型是Convert,而不是MemberAccess

此时需要额外操作

通过调试发现,当lambda类型是Convert的时候,expression的body是一个UnaryExpression类型

通过UnaryExpression.Operand可以获取到他真实的expression,此expression是一个MemberExpression,通过MemberExpression.Member.Name就可以获取到参数的值了。

mvc的ExpressionHelper只提供传入lambdaexpression参数的方法,不提供传入UnaryExpression所以要自己写一下。ExpressionHelper是静态类,里面是都是静态方法,用扩展方法是扩展不进去的。只能自己随便找个地方写写了

1: public static string GetExpressionText(UnaryExpression exp)

2: {

3:     if (exp != null)

4:     {

5:         if (exp.Operand.NodeType == ExpressionType.MemberAccess)

6:         {

7:             MemberExpression memExp = exp.Operand as MemberExpression;

8:             if (memExp != null)

9:             {

10:                 return memExp.Member.Name;

11:             }

12:         }

13:     }

14:     return string.Empty;

15: }


通过更新方法操作类似于

public static void Update<TEntity>(TEntity obj, params Expression<Func<TEntity,object>>[] updateProperties) where TEntity : EntityObject
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐