本帖最后由 jls 于 2013-10-07 17:54:41 编辑

解决方案 »

  1.   

    其实更新部分字段的sql语句,是一种语法糖。本质上,更新数据库的数据,无论你是指定了一个字段,还是所有的字段,都是完整的更新(有的数据库系统内部干脆是删除/插入操作代替更新)。
      

  2.   

    所以,EF转换为完全更新的sql既不会影响性能,也不会改变程序的运行结果,你完全不用担心。
      

  3.   

    这个表数据量巨大,在这个表下还有触发器,在触发器中,通过监视哪些字段是否更新来触发,所以,如果能够做到转换成的SQL语句如果能做到部分更新,对性能上来说,影响是很大的!
      

  4.   

            public void Update<TEntity>(TEntity entity, string[] properties) where TEntity : class
            {
                var entry = base.Entry(entity);
                if (entry.State == EntityState.Detached)
                {
                    this.Set<TEntity>().Attach(entity);
                }
                foreach (var propertyName in properties)
                {
                    entry.Property(propertyName).IsModified = true;
                }
            }
      

  5.   

    KarasCanvas:
    我的实体类Opr_Pro_Work不是继承自EntityObject类,Property属性是EntityObject类的吧?
      

  6.   


    先看清楚..KarasCanvas:能贴一下你这个单元的完整代码吗?先谢谢了!
      

  7.   

    //注释下面这句,
    db.Entry(w1).State = EntityState.Modified;然后生成的SQL,就是只更新字段的SQL语句。
      

  8.   

    xml111024的说法是正确的,但这有一个前提就是
    using (JLSContext db = JLSDBContextManager.GenerateJLSContext())
    {
        Opr_Pro_Work w1=db.Opr_Pro_Work.Where(it=>it.WorkID==1).FirstOrDefault();
        w1.IsPrint = true;    //w1必须是经过db查询得出的实体变量            
        db.SaveChanges();
    }
    using (JLSContext db = JLSDBContextManager.GenerateJLSContext())
                        {                        
                            w1.IsPrint = false;  //如果w1是在创建db前已经存在的,这样就在SaveChanges()的时候不会生成SQL语句
                            db.SaveChanges();
                        }
      

  9.   


    先看清楚..KarasCanvas:能贴一下你这个单元的完整代码吗?先谢谢了!
    这个是DbContext派生类中的方法,适合EF5+
      

  10.   


    先看清楚..KarasCanvas:能贴一下你这个单元的完整代码吗?先谢谢了!
    这个是DbContext派生类中的方法,适合EF5+唉,我使用的是EF4.4,可惜,没有这个方法
      

  11.   

    搞定了,现贴上代码与大家分享:using (JLSContext db = JLSDBContextManager.GenerateJLSContext())
    {
        db.Set<Opr_Pro_Work>().Attach(work);
        work.IsPrint = false;
        db.SaveChanges();
    }
    //这样生成的updateSQL语句如下
    exec sp_executesql N'update [dbo].[Opr_Pro_Work]
    set [IsPrint] = @0
    where ([WorkID] = @1)
    ',N'@0 bit,@1 bigint',@0=0,@1=103