• asp.net mvc EF修改指定数据库列的数据


    EF中会为每个 管理的 实体对象 创建一个代理包装类对象,其中会跟踪 实体对象 的状态和每个属性的状态; [EF对象管理容器]每个通过EF数据上下文操作的实体对象,都需要存在上下文的容器中,一旦通过上下文的某个方法操作了实体对象后,那么上下文就会给它加一个状态标识。但调用上下文的SaveChanges方法的时候,上下文就会遍历容器中的所有对象,并检查他们的状态标识,并依照标识的值进行相应的增删改查sql操作。以更新访问量为例来说明。

    一、通常使用EF更新的方式,先查询出要修改的数据,然后再修改新的值;实体对象被修改的属性 在 代理包装类对象里 的对应属性状态会被修改记录下修改状态,

          等到调用SaveChanges时,EF会遍历其管理的每个实体对象,并根据其 包装类对象 的状态,生成增删改查sql语句并执行;

    //EF context 对象
    MyFirstEFEntities context = new MyFirstEFEntities();
    
    //update
    //1:先查询要修改的原数据
    CustomerInfo customer = context.CustomerInfoes.Find(1);
    //2:设置修改后的值
    customer.customerDate = DateTime.Now;
    //3:更新到数据库
    context.SaveChanges();

    二、为避免先查询数据库,可以直接将 被修改的实体对象 添加到 EF中管理(此时为附加状态Attached),并手动设置其为未修改状态(Unchanged,如果改为Modified,那么执行的更新全部列,不过没有赋新值的列执行生成的update SQL语句时set的值仍是原来的值),同时设置被修改的实体对象的包装类对象 对应属性为修改状态。

    /// <summary>
            /// 更新访问量
            /// </summary>
            public string UpdateVisitedCount(string objId)
            {
                string jsonStr = "{"state":"eeror","message":"0"}";
                int id = Utility.StrToInt(objId, 0);
                ArticleModels articles = db.Articles.Find(id);
                if(articles!=null)
                {
                    //1,将实体对象加入EF对象容器中,并获取伪包装类对象
                    DbEntityEntry<ArticleModels> entry = db.Entry<ArticleModels>(articles);
    
                    //2,将伪包装类对象的状态设置为Unchanged
                    entry.State = System.Data.EntityState.Unchanged;
    
                    //3,对要修改的列进行赋值
                    articles.VisitedCount = articles.VisitedCount + 1;
    
                    //4,设置被改变的属性
                    entry.Property(a => a.VisitedCount).IsModified = true;
                    
                    //5,提交到数据库 完成修改
                    int m = db.SaveChanges();  //返回执行修改的行数
                    if (m > 0)
                    {
                        jsonStr = "{"state":"success","message":"" + m + ""}";
                    }
                }
                return jsonStr;
            }
    
    //程序运行后执行的sql语句为
    exec sp_executesql N'update [dbo].[nuke_utab_article]
    set [VisitedCount] = @0
    where ([ObjectID] = @1)
    ',N'@0 int,@1 int',@0=7,@1=5609
    
    //更简洁的写法
    ArticleModels articles = db.Articles.Find(id);
    db.Entry(articles).State = System.Data.EntityState.Unchanged;
    articles.VisitedCount = articles.VisitedCount + 1;
    db.Entry(articles).Property("VisitedCount").IsModified = true;
    db.SaveChanges();
    
    //某列完全赋新值,指定修改某列
    public string UpdateVisitedCount(string  objId)  
            {  
                string jsonStr = "{"state":"eeror","message":"0"}";  
                int id = Utility.StrToInt(objId, 0); 
                ArticleModels articles = new ArticleModels(); 
                articles.ObjectID = id;  
                articles.ObjectTitle= "测试新值";  
                //1,将实体对象加入EF对象容器中,并获取伪包装类对象
                DbEntityEntry<ArticleModels> entry = db.Entry<ArticleModels>(articles);  
                //2,将伪包装类对象的状态设置为unchanged
                entry.State = System.Data.EntityState.Unchanged;  
                //3,设置被改变的属性
                entry.Property(a => a.VisitedCount).IsModified = true;  
                //4,提交到数据库 完成修改
                int m = db.SaveChanges();  //返回执行修改的行数
                if(m > 0) 
                {  
                    jsonStr = "{"state":"success","message":""+ m + ""}";  
                } 
                return jsonStr; 
            }  
    
    
    注意:这只是其中一种实现方法。
    参考文章:http://www.cnblogs.com/Dr-Hao/p/5255630.html
  • 相关阅读:
    9 *9 乘法表
    总结day04 ---- 列表的切片,增删改查,以及,相关方法, 元祖的使用方法
    三级菜单 -----待学习,待强化
    day04 --class --homework
    购物车项目 复杂版本.待简化
    python 学习资料 常用
    总结day3 ---- 进制转换,字符串切片,字符串常用方法.,for 循环,
    day03 --class --homework
    总结day2 ---- while循环的简单使用, 格式化输出.运算符.以及编码的应用
    Uva 10054 欧拉回路 打印路径
  • 原文地址:https://www.cnblogs.com/wangzl1163/p/6341158.html
Copyright © 2020-2023  润新知