【asp.net core 系列】8 實戰之 利用 EF Core 完成資料操作層的實現
阿新 • • 發佈:2020-06-10
# 0. 前言
通過前兩篇,我們建立了一個專案,並規定了一個基本的資料層訪問介面。這一篇,我們將以EF Core為例演示一下資料層訪問介面如何實現,以及實現中需要注意的地方。
# 1. 新增EF Core
先在資料層實現層引入 EF Core:
```bash
cd Domain.Implements
dotnet add package Microsoft.EntityFrameworkCore
```
當前專案以SqlLite為例,所以再新增一個SqlLite資料庫驅動:
```bash
dotnet add package Microsoft.EntityFrameworkCore.SQLite
```
刪除 Domain.Implements 裡預設的Class1.cs 檔案,然後新增Insfrastructure目錄,建立一個 DefaultContext:
```c#
using Microsoft.EntityFrameworkCore;
namespace Domain.Implements.Insfrastructure
{
public class DefaultContext : DbContext
{
private string ConnectStr { get; }
public DefaultContext(string connectStr)
{
ConnectStr = connectStr;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite(ConnectStr);//如果需要別的資料庫,在這裡進行修改
}
}
}
```
# 2. EF Core 批量載入模型
通常情況下,在使用ORM的時候,我們不希望過度的使用特性來標註實體類。因為如果後期需要變更ORM或者出現其他變動的時候,使用特性來標註實體類的話,會導致遷移變得複雜。而且大部分ORM框架的特性都依賴於框架本身,並非是統一的特性結構,這樣就會造成一個後果:本來應該是對呼叫方隱藏的實現就會被公開,而且在專案引用關係中容易出現迴圈引用。
所以,我在開發中會尋找是否支援配置類,如果使用配置類或者在ORM框架中設定對映關係,那麼就可以保證資料層的純淨,也能實現對呼叫方隱藏實現。
EF Core的配置類我們在《C# 資料訪問系列》中關於EF的文章中介紹過,這裡就不做過多介紹了(沒來得及看的小夥伴們不著急,後續會有一個簡單版的介紹)。
通常情況下,配置類我也會放在Domain.Implements專案中。現在我給大家介紹一下如何快速批量載入配置類:
```c#
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetAssembly(this.GetType()),
t => t.GetInterfaces().Any(i => t.Name.Contains("IEntityTypeConfiguration")));
}
```
現在版本的EF Core支援通過Assembly載入配置類,可以指定載入當前上下文類所在的Assembly,然後篩選實現介面中包含IEntityTypeConfiguration的類即可。
# 3. 使用EF Core實現資料操作
我們已經建立好了一個EF Context,那麼現在就帶領大家一起看一下,如何使用EF來實現 上一篇《「asp.net core」7 實戰之 資料訪問層定義》中介紹的資料訪問介面:
新建一個BaseRepository類,在Domain.Implements專案的Insfrastructure 目錄下:
```c#
using Domain.Infrastructure;
using Microsoft.EntityFrameworkCore;
namespace Domain.Implements.Insfrastructure
{
public abstract class BaseRe