码迷,mamicode.com
首页 > 其他好文 > 详细

EF 批量更新

时间:2015-07-09 17:42:51      阅读:813      评论:0      收藏:0      [点我收藏+]

标签:

EF5批量插入

在园里看到别人的文章,将下面两个属性设为false会提高批量插入的效率,

db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;

于是自己试了下,确实速度更快,代码如下:

技术分享
// 批量插入
        public ActionResult BulkInsert()
        {
            int count = 1000;
            string check = null;
            Movie test = new Movie();
            Random ra = new Random();
            System.Text.StringBuilder result = new System.Text.StringBuilder();

            var now1 = DateTime.Now.TimeOfDay;
            result.Append(string.Format("<p>{0}开始将数据Add到上下文中,数据量:{1}</p>", now1, count));

            if (check != null)
            {
                db.Configuration.AutoDetectChangesEnabled = false;
                db.Configuration.ValidateOnSaveEnabled = false;
            }

            for (int i = 0; i < count; i++)
            {
                test = new Movie();
                test.Title = "电影名称"+i;
                test.ReleaseDate = DateTime.Now;
                test.Price = i;
                db.Movie.Add(test);
            }
            var now2 = DateTime.Now.TimeOfDay;
            result.Append(string.Format("<p>{0}数据Added完毕,开始执行Insert操作,耗时{1}</p>", now2, now2 - now1));
            result.Append(string.Format("<p>AutoDetectChangesEnabled 状态:{0}</p>", db.Configuration.AutoDetectChangesEnabled));
            try
            {
                db.SaveChanges();
            }
            finally
            {
                db.Configuration.AutoDetectChangesEnabled = true;
                db.Configuration.ValidateOnSaveEnabled = true;
            }

            var now3 = DateTime.Now.TimeOfDay;
            result.Append(string.Format("<p>{0}Insert完毕,耗时{1}</p>", now3, now3 - now2));

            ViewBag.result = result.ToString();

            return Content(Newtonsoft.Json.JsonConvert.SerializeObject(result.ToString()));
        }
View Code

 

接下来才是本文的重点:EF5 批量更新

普通方法,我们需要循环list更新model,然后再保存到数据库。

以微软的Movie为例,我要更新Title,凡是Title中包含“电影”的我们在它的后面加上“音乐”二字

         //批量更新
        public ActionResult BulkUpdate()
        {
            var list =db.Movie.Where(e=>e.Title.Contains("电影"));
            foreach(var item in list)
            {
                item.Title=item.Title+"音乐";
            }
            db.SaveChanges();
            return Content(Newtonsoft.Json.JsonConvert.SerializeObject(new { msg="更新成功"}));
        }

本来一句sql可以解决的更新,放在EF里反而变得很复杂,还好有高人写了一个批量插入、批量更新的扩展,叫做

Entity Framework Extended Library

下载地址:https://github.com/loresoft/EntityFramework.Extended   支持ef5.0/6.0   也可以在nuget上直接安装这个包

     //批量更新 extend
        public ActionResult ELBulkUpdate()
        {
            db.Movie.Where(e => e.Title.Contains("电影")).Update(e => new Movie { Title=e.Title+"音乐"});
            return Content(Newtonsoft.Json.JsonConvert.SerializeObject(new { msg = "更新成功" }));
        }

看一下代码,是不是清爽了很多,代码很简洁优美,至于两者的效率,喜欢尝试的朋友不妨动动手试验一下!

这个类库支持批量更新、批量查询、批量删除!

扩展库还支持查询缓存功能:

var users = container.Users.Where(u => u.Id > 5).FromCache(CachePolicy.WithDurationExpiration(TimeSpan.FromSeconds(10)));

如果在10秒内重复查询,则会从缓存中读取,不会查询数据库

另外,微软在ef6中加入了批量操作。 

EF 批量更新

标签:

原文地址:http://www.cnblogs.com/nowar/p/ef_update.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!