當前位置:
首頁 > 知識 > 基於Entity Framework的自定義分頁,增刪改的通用實現

基於Entity Framework的自定義分頁,增刪改的通用實現

簡介

之前寫個一個基於Dapper的分頁實現,現在再來寫一個基於Entity Framework的分頁實現,以及增刪改的通用實現。

代碼如何運行示例

還是像先前一樣:

1. 先Clone下代碼,在Database裡面解壓縮Database.7z

2. Attach到Sql Server LocalDB上。如果你用的不是Sql Server的LocalDB,你需要更改App.Config里的連接字元串。

3. Ctrl + F5,運行示常式序。

基於Entity Framework的自定義分頁,增刪改的通用實現

Repository 基類 - 查詢

CommonAbstractRepository.cs 是Repository的基類,實現了增刪改查的一些方法,例如:

public virtual Tuple<IEnumerable<T>, int> Find(Expression<Func<T, bool>> criteria
, int pageIndex
, int pageSize
, string[] asc
, string[] desc
, params Expression<Func<T, object>>[] includeProperties)

這個方法是AbstractRepository查詢方法中的一個,用於自定義分頁查詢,其中criteria 為一個表達式,作為查詢的條件,參數pageIndex, pageSize, asc, desc為分頁相關參數;

關於多表(關聯表):

includeProperties為在多表時候,Join相關聯的表。因為EF默認是Lazy Loading,相關聯的表默認不是立即載入的,所以有時候如果寫代碼不小心,在for循環里就有可能會循環查詢n個字表。用來includeProperties參數,就可以在查詢時候join關聯表。

Repository 基類 - 增刪改

AbstractRepository已經用泛型實現了增刪改方法:

  • public virtual T Create(T entity)
  • public virtual T Update(T entity)
  • public virtual T CreateOrUpdate(T entity)
  • public virtual void Delete(TId id)

另外,關於transaction的實現,我使用了Unit of Work模式,多個Repository共享一個DBContext,關於UOW,請在CommonUnitOfWork.cs里找到。

調用UOW的時候,基本類似於這樣:

var uow = new EFUnitOfWork;
var repo = uow.GetLogRepository;

repo.Create(new Log
{
LevelId = 1,
Thread = "",
Location = "Manual Creation",
Message = "This is manually created log.",
CreateTime = DateTimeOffset.Now,
Date = DateTime.Now
});

uow.Commit;

從UnitOfWork里得到一個或多個Repository,共享DBContext,做增刪改操作,最後uow統一SaveChanges。

Repository的派生類

由於已經有了AbstractRepository,實現了增刪改查的很多方法,所以派生類,例如示例項目里的LogRepository基本就可以變得很簡單,主要實現一些特定的業務邏輯,在示例項目里,因為沒有特殊的業務邏輯,所以會很簡單:

public class LogRepository : AbstractRepository<Log, int>
{
public LogRepository(EFContext context)
: base(context)
{
}
}

關於Entity的生成

本人比較喜歡Database First 實現,先設計資料庫,然後用edmx reverse engineering,生成POCO。可以參考Entity目錄下的相關文件。

當然,如果你喜歡Code First,同樣沒有問題,仍然適用本文的實現。

使用Logging日誌追蹤EF SQL

在使用Entity Framework的時候,最好關心一下EF所生成的SQL,這樣可以在開發階段發現一些潛在的性能問題,避免在生產環境焦頭爛額:)

在CommonEFContext.cs 里,有一個配置項EnableTraceSql,如果為true,那麼所以EF生成的SQL將會被nlog記錄下來。我將nlog的日誌配置到了資料庫。也就是說,在你運行示例項目時,每次查詢,都會增加新的日誌記錄,內容為查詢時生成的SQL:

基於Entity Framework的自定義分頁,增刪改的通用實現

Specification Pattern

在查詢方法里,有個重載是接受一個ISpecification示例,這樣的實現可以有效的控制業務邏輯,對於寫給被其他人調用的介面來說,可以明確的確定查詢參數,例如:

public class LogSearchSpecification : ISpecification<Log>
{
public string LevelName { get; set; }
public string Message { get; set; }
public Expression<Func<Log, bool>> ToExpression
{
return log => (log.Level.Name == LevelName || LevelName == "") &&
(log.Message.Contains(Message) || Message == "");
}

public bool IsSatisfiedBy(Log entity)
{
return (entity.Level.Name == LevelName || LevelName == "") &&
(entity.Message.Contains(Message) || Message == "");
}
}

那麼,調用這個查詢方法的代碼就可以明確知道,我的查詢條件為LevelName和Message,至於LevelName是等於以及Message為Like則是在LogSearchSpeficiation里實現,做到很好的封裝。

最後

這套實現是幾年來平時慢慢積累的,是經過實踐的,所以應該可以作為一定的參考,當然,在具體的項目里,可以用一些DI去拿到Repository等等,不在本文討論範圍,大家可以自由發揮,希望對大家可以有所幫助,謝謝。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

在linux中安裝git,並將代碼發布到github
RandomAccessFile類的使用
Android——Intent組件帶參傳遞與返回
配置ssh免密碼登錄——集群學習日記
Jenkins:執行 PowerShell 命令

TAG:科技優家 |

您可能感興趣

mysql8+mybatis-plus3.1自動生成lombok和swagger和增刪改查介面
nodejs連接mongodb,對數據增刪改查操作(跳過坑)Windows版
詳解node + mongoDb(mongoDb安裝、運行,在node中連接增刪改查)
用js方法splict()、indexOf()、push()等操作數組Array增刪改查
sql dao增刪改查
Adobe Flash國內特供版後續:國內方修改用戶協議,刪改隱私聲明……
Mybatis介面編程方式實現增刪改查
最新的PHP操作MongoDB增刪改查操作匯總
資料庫 MySQL單表 增刪改
#Voice:《地獄男爵》俄版台詞遭刪改,斯大林變成了希特勒
Voice:《地獄男爵》俄版台詞遭刪改,斯大林變成了希特勒
官方刪改RNG八強視頻?Uzi臉探草叢畫面被剪 引起網友熱議
DNF中曾經被刪改的技能,這些技能就是職業特色!你可曾記得?
LOL:因太強被拳頭刪改的4個技能,劍聖Q技能5殺隨便拿
「票房」電影刪改了還看不看,這成了一個問題
動漫·語錄·扎心壁紙:刪刪改改也只不過是想說一句,我想你了!
即將上映的四部優質國漫,最被看好的它剛出預告就被要求刪改!
這部國產敏感題材,被刪改後依舊戳人心!
高分國產電影,即便題材敏感,被刪改後依舊痛戳人心!
延禧攻略中的穿幫歷史,順嬪到底屬於誰?原著黨:不要亂刪改啊!