EntityFramework.Extended

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

 

 

 

自2015年以來再也不支持

重要信息:自2015年以來,再也不支持此庫。咱們強烈建議您轉到Entity Framework Plusgit

實體框架擴展

網站:https//entityframework-extensions.net/github

付費庫可顯着提升實體框架性能:數據庫

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

實體框架加

網站:https//entityframework-plus.net/緩存

免費和開源庫,支持如下功能:服務器

  • 審計
  • 批量操做
    • 批量刪除
    • 批量更新
  • 詢問
    • 查詢緩存
    • 查詢延期
    • 查詢過濾器
    • 查詢將來
    • 查詢IncludeFilter
    • 查詢IncludeOptimized

實體框架擴展庫

下載

實體框架擴展庫可經過包名在nuget.org上得到EntityFramework.Extendedapp

要安裝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。

使用如下擴展方法建立未來的查詢...

  • 將來()
  • 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;
相關文章
相關標籤/搜索