zoukankan      html  css  js  c++  java
  • EF指定更新字段,强类型,有提示

    在不同的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
    
  • 相关阅读:
    关于接口测试的一些个人总结
    PMP学习考试回顾与心得
    RHCE第2课
    RHCE第1课
    kafka中对于zookeeper的理解和leader选举过程
    基于python的Selenium使用
    安装python第三方包的几种方式
    Vi命令下几种容易混淆的插入方式
    python单元测试框架unittest
    关于SQL子查询的一个问题
  • 原文地址:https://www.cnblogs.com/czcz1024/p/2203979.html
Copyright © 2011-2022 走看看