EntityFramework.Extended

github:https://github.com/zzzprojects/EntityFramework.Extended

 

 

 

自2015年以来不再支持

重要信息:自2015年以来,不再支持此库。我们强烈建议您转到Entity Framework Plus

实体框架扩展

网站:https//entityframework-extensions.net/

付费库可显着提高实体框架性能:

  • BulkSaveChanges
  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge
  • BulkSynchronize

实体框架加

网站:https//entityframework-plus.net/

免费和开源库,支持以下功能:

  • 审计
  • 批量操作
    • 批量删除
    • 批量更新
  • 询问
    • 查询缓存
    • 查询延期
    • 查询过滤器
    • 查询未来
    • 查询IncludeFilter
    • 查询IncludeOptimized

实体框架扩展库

下载

实体框架扩展库可通过包名在nuget.org上获得EntityFramework.Extended

要安装EntityFramework.Extended,请在程序包管理器控制台中运行以下命令

PM> Install-Package EntityFramework.Extended

有关NuGet包的更多信息,访问 https://nuget.org/packages/EntityFramework.Extended

特征

批量更新和删除

实体框架的当前限制是,为了更新或删除实体,您必须首先将其检索到内存中。现在在大多数情况下,这很好。然而,有一些senerios性能会受到影响。此外,对于单个删除,必须先检索该对象,然后才能删除该对象,从而需要对数据库进行两次调用。批量更新和删除消除了在修改实体之前检索和加载实体的需要。

删除

//delete all users where FirstName matches
context.Users
    .Where(u => u.FirstName == "firstname")
    .Delete();

更新

//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"});

未来的查询

构建所需数据的查询列表,并在第一次访问任何结果时,所有数据将在一次往返数据库服务器中检索。减少到数据库的次数是一个很好的选择。使用此功能非常简单,.Future()只需附加到查询结尾即可。使用Future Queries。

使用以下扩展方法创建将来的查询...

  • 未来()
  • FutureFirstOrDefault()
  • FutureCount()

样品

// 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能够设置分页控件,您需要一个总计数。使用Future,我们可以将查询批处理在一起,以便在一次数据库调用中获取所有数据。

未来的查询通过创建保持IQuerable的适当IFutureQuery对象来工作。然后将IFutureQuery对象存储在IFutureContext.FutureQueries列表中。然后,当枚举其中一个IFutureQuery对象时,它通过LoadAction委托调用IFutureContext.ExecuteFutureQueries()。ExecuteFutureQueries从所有存储的IFutureQuery对象构建批处理查询。最后,使用查询结果更新所有IFutureQuery对象。

查询结果缓存

要缓存查询结果,请使用FromCache扩展方法。下面是一个示例缓存查询结果。只需像往常一样构建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)));

查询结果缓存还支持标记缓存,因此您可以通过调用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()方法,并且有一种方法可以将AuditLog轻松转换为xml以便于存储。

可以通过实体上的属性或通过Fluent配置API自定义AuditLog。

流畅的配置

// 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;
posted @ 2018-12-18 11:50  来自潘大大  阅读(671)  评论(0编辑  收藏  举报