标签:
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())); }
接下来才是本文的重点: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里反而变得很复杂,还好有高人写了一个批量插入、批量更新的扩展,叫做
下载地址: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中加入了批量操作。
标签:
原文地址:http://www.cnblogs.com/nowar/p/ef_update.html