您的位置:首页 > 编程语言 > ASP

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

2016-07-04 11:53 791 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息