zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    JS中的call_user_func封装
    js中insertAdjacentHTML的玩法
    小tip: DOM appendHTML实现及insertAdjacentHTML
    js获取和设置属性的方法
    安装Yeoman,遇到的问题
    HTML中Select的使用详解
    jQuery Ajax异步处理Json数据详解
    chrome浏览器Uncaught TypeError: object is not a function问题解决
    SpringBoot Web实现文件上传下载功能实例解析
    SpringMVC Web实现文件上传下载功能实例解析
  • 原文地址:https://www.cnblogs.com/panmy/p/10136235.html
Copyright © 2011-2022 走看看