接手了一个用EF来做的项目,由于项目中使用的原生处理,导致很多update都是采用先select 后 update的方式来实现,同时无法批量执行逻辑如:根据订单类型统一更新状态等。所以在经过了N多查找之后 发现了一个国外写的扩展插件EntityFramework.Extended 。

Github:https://github.com/loresoft/EntityFramework.Extended

简单说一下用法:

Deleting

//delete all users where FirstName matches

context.Users

.Where(u => u.FirstName == "firstname")

.Delete();

Update

//update all tasks with status of 1 to status of 2

context.Tasks

.Where(t => t.StatusId == 1)

.Update(t => new Task { StatusId = 2 });

 

//example of using an IQueryable as the filter for the update

var users = context.Users.Where(u => u.FirstName == "firstname");

context.Users.Update(users, u => new User {FirstName = "newfirstname"});

看示例代码就已经很直观了。

还有2个很少被人提到的功能:

将来的查询

建立对你所需要的数据,并在第一时间在任何结果的查询列表被访问,所有数据都将在一个往返到数据库服务器中检索。降低数据查询成本。使用此功能是附加一样简单.Future()您的查询的末尾。要使用将来的查询,确保导入EntityFramework.Extensions命名空间。

将来的查询与下面的扩展方法创建...

  • Future()
  • FutureFirstOrDefault()
  • FutureCount()

Demo

// build up queries

var q1 = db.Users

    .Where(t => t.EmailAddress == "one@test.com")

    .Future();

 

var q2 = db.Tasks

    .Where(t => t.Summary == "Test")

    .Future();

 

// this triggers the loading of all the future queries

var users = q1.ToList();

在上面的例子中,有2个查询建立起来的,只要查询中的一个被枚举,它触发两个查询的批次负载。

// base query

var q = db.Tasks.Where(t => t.Priority == 2);

// get total count

var q1 = q.FutureCount();

// get page

var q2 = q.Skip(pageIndex).Take(pageSize).Future();

 

// triggers execute as a batch

int total = q1.Value;

var tasks = q2.ToList();

在这个例子中,我们必须的任务列表共同senerio。为了使GUI设置寻呼控制,你需要一个总数。随着未来我们可以批量在一起的查询来获得一个数据库调用的所有数据。

将来的查询通过创建保持IQuerable适当IFutureQuery对象工作。然后IFutureQuery对象存储在IFutureContext.FutureQueries列表。然后,当IFutureQuery对象之一被枚举,它调用回IFutureContext.ExecuteFutureQueries()经由LoadAction委托。ExecuteFutureQueries建立从所有的存储IFutureQuery对象批量查询。最后,所有的IFutureQuery对象与从查询的结果进行更新。

查询结果缓存

缓存查询结果,请使用FromCache位于扩展方法EntityFramework.Extensions命名空间。下面是一个示例高速缓存查询结果。简单地构建LINQ查询,你通常会,然后追加的FromCache扩展。

//query is cached using the default settings

var tasks = db.Tasks

    .Where(t => t.CompleteDate == null)

    .FromCache();

 

//query result is now cached 300 seconds

var tasks = db.Tasks

    .Where(t => t.AssignedId == myUserId && t.CompleteDate == null)

    .FromCache(CachePolicy.WithDurationExpiration(TimeSpan.FromSeconds(300)));

查询结果Cache也支持标记缓存,以便您可以通过调用过期常见的缓存条目Expire上的高速缓存标记。

// cache assigned tasks

var tasks = db.Tasks

    .Where(t => t.AssignedId == myUserId && t.CompleteDate == null)

    .FromCache(tags: new[] { "Task", "Assigned-Task-" + myUserId  });

 

// some update happened to Task, expire Task tag

CacheManager.Current.Expire("Task");

在CacheManager对供应商的支持。默认提供程序使用MemoryCache存储缓存条目。要创建一个自定义的供应商,实施ICacheProvider。然后,自定义提供程序将需要在登记Locator容器。

// Replace cache provider with Memcached provider

Locator.Current.Register<ICacheProvider>(() => new MemcachedProvider());

审计日志

审计日志功能将捕捉到的变化随时它们被提交到数据库实体。审核日志仅捕获那些上发生了变化,这些变化的实体,只有属性的实体。该前和记录值之后, AuditLogger.LastAudit就是在这个信息被举行,是一个ToXml()可以很容易把审计日志转换为XML,便于储存方法。

审计日志可以通过在实体上或通过流利的配置API的属性自定义。

流利的配置

// config audit when your application is starting up...

var auditConfiguration = AuditConfiguration.Default;

 

auditConfiguration.IncludeRelationships = true;

auditConfiguration.LoadRelationships = true;

auditConfiguration.DefaultAuditable = true;

 

// customize the audit for Task entity

auditConfiguration.IsAuditable<Task>()

    .NotAudited(t => t.TaskExtended)

    .FormatWith(t => t.Status, v => FormatStatus(v));

 

// set the display member when status is a foreign key

auditConfiguration.IsAuditable<Status>()

    .DisplayMember(t => t.Name);

创建审核日志

var db = new TrackerContext();

var audit = db.BeginAudit();

 

// make some updates ...

 

db.SaveChanges();

var log = audit.LastLog;

 

问题归纳

  1. 为什么没有 update方法 :缺少引用 using EntityFramework.Extensions;
  2. 错误:无法将类型system.data.* 转化为 *.Iquery<entity>:Extended 版本与ef版本不对应,请在nuget中查询匹配版本。
  3. Update 无效,请跟踪sql 脚本 以区分生成的 update where条件是否正确,与lambda 的 常量.Equals(变量) 不同 他是按照顺序生成sql where的所以 生成的 是 常量 is null or 。。。。。。请注意lambda 顺序

 

EntityFramework 插件之EntityFramework.Extended (批量处理)的更多相关文章

  1. 测试EntityFramework,Z.EntityFramework.Extensions,原生语句在不同的查询中的表现。原来池化与非池化设定是有巨大的影响的。

    Insert测试,只测试1000条的情况,多了在实际的项目中应该就要另行处理了. using System; using System.Collections.Generic; using Syste ...

  2. jenkins插件Configuration Slicing plugin批量修改配置

    作用 批量修改jenkins上job配置

  3. [推荐]两款Flash上传插件(1)–CFUpdate文件批量上传组件

    搞开发的同学都知道,网上可搜到的可用的Flash图片上传的组件少之又少,可定制界面,不需要安装组件,且可免费用于任何商业系统的,更是凤毛麟角,如果你和我一样,迫切需要一款这样的一款组件的话,不妨试试C ...

  4. Entity Framework Extended 批量删除

    public static class DbContextExtensions { public static void DeleteBatch<T>(this DbContext con ...

  5. 第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题

    一. 综述 该模块主要介绍:EF的性能优化插件Z.EntityFramework.Extensions,该插件收费. (一). 简介 1. 相关网站:http://www.zzzprojects.co ...

  6. (转)EntityFramework.Extensions

    转自:http://www.symbolsource.org/Public/Metadata/NuGet/Project/EntityFramework.Extended/1.0.0.20/Relea ...

  7. 死去活来,而不变质:Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?

    写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?>博文中, ...

  8. EntityFramework 7 开发纪录

    博文目录: 暂时开发模式 Code First 具体体现 DbContext 配置 Entity 映射关联配置 Migration 问题纪录(已解决) 之前的一篇博文:EF7 Code First O ...

  9. Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货)

    接口数据处理模块是什么意思呢?实际上很简单,就是使用面向接口的思想和方式来做数据处理. 还提到EntityFramework和Dapper,EntityFramework和Dapper是.net环境下 ...

随机推荐

  1. WinForm自定义验证控件

    本文转载:http://blog.csdn.net/ziyouli/article/details/7583824 此篇博文不错:http://blog.csdn.net/sony0732/artic ...

  2. EF 5.0 和 EF4.0 语法区别

    // 实现对数据库的添加功能,添加实现EF框架的引用 40 41 public T AddEntity(T entity) 42 43 { 44 45 //EF4.0的写法 添加实体 46 47 // ...

  3. 2013ACM暑假集训总结-致将走上大三征途的我

    回想起这个暑假,从开始与雄鹰一起的纠结要不要进集训队,与吉吉博博组队参加地大邀请赛,害怕进不了集训队.当时激励我月份开始接触的,记得当时在弄运动会来着,然后就问了雄鹰一些输入输出的东西,怀着满心的期待 ...

  4. Git和Github的应用与命令方法总结

    title: Git和Github的应用与命令方法总结 date: 2016-07-11 14:03:09 tags: git/github [本文摘抄自微信公众平台:AndroidDeveloper ...

  5. .net框架介绍

    .net 一般指 .net Framework框架,是一种平台,一种技术 C# 是一种编程语言,可以开发基于.net平台的应用 Java 既是一种技术,也是一种语言 .net可以开发桌面应用程序    ...

  6. asp.net,mvc4,mysql数据库,Ef遇到问题集合

    asp.net  mvc  mysql数据库,在我一个新手自学MVC4时遇到如下的问题,一一解决掉的方法记录如下方便自己日后查看,也为了方便一些像我一样的新手遇到如下问题时,提供参考 问题一: 解决办 ...

  7. 在ssh框架中注解方式需要注意的几个问题

    1.注解方式的时候 Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 set ,get ...

  8. Java对象序列化入门

      Java对象序列化入门 关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制 ...

  9. MySQL拷贝表的几种方式

    假如我们有以下这样一个表: id      username    password ----------------------------------- 1       admin       * ...

  10. 想加入一行代码吗?使用<code>标签

    在介绍语言技术的网站中,避免不了在网页中显示一些计算机专业的编程代码,当代码为一行代码时,你就可以使用<code>标签了,如下面例子: <code>var i=i+300;&l ...