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;