github:https://github.com/zzzprojects/EntityFramework.Extendedios
重要信息:自2015年以來,再也不支持此庫。咱們強烈建議您轉到Entity Framework Plus。git
網站:https://entityframework-extensions.net/github
付費庫可顯着提升實體框架性能:數據庫
網站:https://entityframework-plus.net/緩存
免費和開源庫,支持如下功能:服務器
實體框架擴展庫可經過包名在nuget.org上得到EntityFramework.Extended
。app
要安裝EntityFramework.Extended,請在程序包管理器控制檯中運行如下命令框架
PM> Install-Package EntityFramework.Extended
有關NuGet包的更多信息,請訪問 https://nuget.org/packages/EntityFramework.Extendedide
實體框架的當前限制是,爲了更新或刪除實體,您必須首先將其檢索到內存中。如今在大多數狀況下,這很好。然而,有一些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。
使用如下擴展方法建立未來的查詢...
樣品
// 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;