前言
EF Core是我們.NET日常開發中比較常用的ORM框架,今天大姚要分享的內容是如何使用EF Core Generic Repository通用倉儲庫來快速實現EF Core數據倉儲模式。
EF Core Generic Repository介紹
該庫是EF Core ORM的通用倉儲庫實現,旨在簡化開發人員爲每個.NET Core和.NET項目編寫倉儲層的工作。通過使用這個庫,開發人員可以更輕鬆地管理數據訪問層,提高開發效率。
值得推薦的.NET ORM框架
對於還不知道怎麼選擇.NET ORM框架的同學可以看下面這兩篇文章,希望對你會有所幫助😁。
數據倉儲(Repository)介紹
Repository(倉儲)是DDD(領域驅動設計)中的經典思想,可以歸納爲介於實際業務層(領域層)和數據訪問層之間的層,能讓領域層能在感覺不到數據訪問層的情況下,完成與數據庫的交互和以往的DAO(數據訪問)層相比,Repository層的設計理念更偏向於面向對象,而淡化直接對數據表進行的CRUD操作。
類庫特點
- 該庫可以在任何. NET Core或.NET應用程序上運行,該應用程序具有.NET Core 3.1、.NET Standard 2.1和.NET 5.0+支持。
- 提供了帶有數據庫事務支持的通用存儲庫。
- 擁有所有必需的方法,以任何你想要的方式查詢數據,而無需從存儲庫獲取IQueryable。
- 支持
Specification<T>
模式,使你能夠動態構建查詢,即延遲查詢構建。 - 具有針對你的查詢的數據庫級投影支持。
- 支持針對你的關係型數據庫運行原始SQL命令。
- 支持選擇是否要跟蹤你的查詢實體/實體。
- 支持在確實需要時重置你的EF Core DbContext狀態。
- 具有完整的單元測試支持。
- 支持分頁、原始SQL查詢支持複雜類型和原始類型。
項目源代碼
新建控制檯應用
新建名爲:GenericRepositoryExercise
控制檯應用。
相關類庫安裝
搜索名爲:TanvirArjel.EFCore.GenericRepository
的NuGet安裝。
因爲我們要訪問Microsoft SQL Server數據庫,因此我們需要安裝Microsoft.EntityFrameworkCore.SqlServer
NuGet包。
新建UserInfo類
[Table("UserInfo")]
public class UserInfo
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public int Age { get; set; }
[Required]
public string Email { get; set; }
}
新建數據庫上下文類
新建名爲:TestDbContext
數據庫上下文類。
public class TestDbContext : DbContext
{
public TestDbContext(DbContextOptions<TestDbContext> options) : base(options)
{
}
public DbSet<UserInfo> UserInfo { get; set; }
}
新建UserInfoService(包含常見CRUD)
public class UserInfoService
{
private readonly IRepository<TestDbContext> _repository;
public UserInfoService(IRepository<TestDbContext> repository)
{
_repository = repository;
}
public async Task UserInfoCRUD()
{
// 創建一個新用戶
var newUser = new UserInfo { Name = "daydayup", Age = 28, Email = "[email protected]" };
await _repository.AddAsync(newUser);
await _repository.SaveChangesAsync();
// 更新用戶信息
newUser.Email = "[email protected]";
_repository.Update(newUser);
await _repository.SaveChangesAsync();
// 刪除用戶
_repository.Remove(newUser);
await _repository.SaveChangesAsync();
// 查詢所有用戶
var users = await _repository.GetListAsync<UserInfo>();
foreach (var user in users)
{
Console.WriteLine($"Id: {user.Id}, Name: {user.Name}, Age: {user.Age}, Email: {user.Email}");
}
//查詢總數
var totalCount = await _repository.GetCountAsync<UserInfo>();
// 根據條件查詢用戶
var filteredUsers = await _repository.GetListAsync<UserInfo>(u => u.Age > 25);
foreach (var user in filteredUsers)
{
Console.WriteLine($"Id: {user.Id}, Name: {user.Name}, Age: {user.Age}, Email: {user.Email}");
}
}
}
在Program.cs中註冊相關服務
internal class Program
{
static async Task Main(string[] args)
{
//設置依賴注入容器
IServiceCollection services = new ServiceCollection();
services.AddScoped<UserInfoService>();
var connectionString = "Server=.;Database=MyTestDB;User Id=test;Password=123456;trustServerCertificate=true;";
services.AddDbContext<TestDbContext>(option => option.UseSqlServer(connectionString));
//註冊DbConext後立即調用它
services.AddGenericRepository<TestDbContext>();
IServiceProvider serviceProvider = services.BuildServiceProvider();
//從容器中獲取UserInfoService實例並執行操作
var userInfoService = serviceProvider.GetRequiredService<UserInfoService>();
await userInfoService.UserInfoCRUD();
}
}
項目源碼地址
更多項目實用功能和特性歡迎前往項目開源地址查看👀,別忘了給項目一個Star支持💖。
- GitHub源碼:https://github.com/TanvirArjel/EFCore.GenericRepository
- 文章示例源碼:https://github.com/YSGStudyHards/DotNetExercises/tree/master/GenericRepositoryExercise
優秀項目和框架精選
該項目已收錄到C#/.NET/.NET Core優秀項目和框架精選中,關注優秀項目和框架精選能讓你及時瞭解C#、.NET和.NET Core領域的最新動態和最佳實踐,提高開發工作效率和質量。坑已挖,歡迎大家踊躍提交PR推薦或自薦(讓優秀的項目和框架不被埋沒🤞)。
https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
DotNetGuide技術社區交流羣
- DotNetGuide技術社區是一個面向.NET開發者的開源技術社區,旨在爲開發者們提供全面的C#/.NET/.NET Core相關學習資料、技術分享和諮詢、項目框架推薦、求職和招聘資訊、以及解決問題的平臺。
- 在DotNetGuide技術社區中,開發者們可以分享自己的技術文章、項目經驗、學習心得、遇到的疑難技術問題以及解決方案,並且還有機會結識志同道合的開發者。
- 我們致力於構建一個積極向上、和諧友善的.NET技術交流平臺。無論您是初學者還是有豐富經驗的開發者,我們都希望能爲您提供更多的價值和成長機會。