EntityFramework 插件之EntityFramework.Extended (批量处理)

接手了一个用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 == "[email protected]")
    .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 顺序

?

时间: 2024-12-08 17:20:22

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

原创:关于使用Mybatis插件自动生成造成批量插入转换成list集合的问题以及解决方案(转载请注明出处,谢谢!)

问题: 由于项目中需要批量插入的功能,然后我就用到了阿里的json包,将json数据转换成list集合在批量添加到数据库,但是这个过程中,我突然发现一个问题,之前接收前台传来的值是有的,但转换之后某些字段的值没有了,后面发现,原来是Mybatis自动生成插件做的怪,将实体类赋setter和getter方法时,并没有将属性大写,也就是说原本我的实体字段为gName;setter方法之后为setgName,这就违反了命名规则,但是阿里json包就出现了不能转换报Null的问题,经过试验,终于找到了解

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

搞开发的同学都知道,网上可搜到的可用的Flash图片上传的组件少之又少,可定制界面,不需要安装组件,且可免费用于任何商业系统的,更是凤毛麟角,如果你和我一样,迫切需要一款这样的一款组件的话,不妨试试CFUpdate吧. 以下是我修改的一个Demo效果,你也可以猛击此处查看在线Demo. CFUpdate可选择多个图片上传,显示上传速度.进度条.文件名称等,可拖动排序文件顺序,CFUpdate使用的是HTTP协议,所以客户 端,服务端都不需要安装任何组件.因为是模仿FORM表单提交,所以支持ASP

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

面向接口数据处理模块是什么意思呢?实际上很简单,就是使用面向接口的思想和方式来做数据处理. 还提到EntityFramework和Dapper,EntityFramework和Dapper是.net环境下推崇最高的两种ORM工具. 1.EntityFramework是微软出的根正苗红的.netd的ORM工具,直接在Vs工具和Mvc框架中集成了,默认生成的项目就是使用EntityFramework的;微软也一直都在维护更新升级,最新版本最新版本都在EF7了.也迁移到了最新的.net Core平台了

EntityFramework Code First Demo 更新数据库

1.使用Nuget安装EntityFramework 2.AppConfig文件 <?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?Li

EntityFramework在root目录web.config中的配置设置

未找到具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序.请确保在应用程序配置文件的“entityFramework”节中注册了该提供程序.有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=260882. 确保项目中引入 pasting entityFramework.dll,然后在配置文件中配置(如果使用nuget)install包,可以忽略该篇随笔 <configuration> <

entityFramework使用 codefirst

新建项目 用nuget安装entityFramework,Install-Package Entityframework 建一个model和context //[Table("Customers")] public class Customer { //[Key] public System.Guid Id { get; set; } public int Number { get; set; } public string Name { get; set; } public Syst

关于EntityFramework 7 开发学习

Entity Framework (又称ADO.NET Entity Framework) 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,现已经包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中发表. ADO.NET Entity Framework 以 Entity Data Model (EDM) 为主,将

ABP示例程序-使用AngularJs,ASP.NET MVC,Web API和EntityFramework创建N层的单页面Web应用

本片文章翻译自ABP在CodeProject上的一个简单示例程序,网站上的程序是用ABP之前的版本创建的,模板创建界面及工程文档有所改变,本文基于最新的模板创建.通过这个简单的示例可以对ABP有个更深入的了解,每个工程里应该写什么样的代码,代码如何组织以及ABP是如何在工程中发挥作用的. 源文档地址:https://www.codeproject.com/Articles/791740/Using-AngularJs-ASP-NET-MVC-Web-API-and-EntityFram 源码可以

Mysql 6.7.7 + EntityFramework 5.0 Code First 不能 Update-Database 问题的解决

1.修改 Migrations/Configuration.cs 文件 1 namespace DataModel.Migrations 2 { 3 using System; 4 using System.Data.Entity; 5 using System.Data.Entity.Migrations; 6 using System.Linq; 7 8 internal sealed class Configuration : DbMigrationsConfiguration<DataM