原文地址: https://www.jeremyjone.com/638/,轉載請註明
本文演示了MySql Entityframework在.net core中的基本使用。
添加依賴包
使用NuGet添加依賴,全部使用最新的即可。
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Tools
MySql.Data.EntityFrameworkCore
Plmelo.EntityFrameworkCore.MySql
安裝後,就可以添加代碼了。
添加連接
在appsettings.json
中添加如下代碼:
"ConnectionStrings": {
"Database": "Server=192.168.1.22;User Id=jeremyjone;Password=123456;Database=db;"
}
這裏注意,需要將所有參數換成自己的正確參數。如果數據庫不是本地的,一般情況下是不能用root用戶的,需要注意。
創建實體
這裏需要注意,此操作是基於數據庫已經創建好的情況,一般情況下,我也更推薦這種做法,數據庫在初期就已經創建好,不需要進行來回變動。
我的測試數據庫中有一個company表:
在程序包管理器控制檯(工具 -> NuGet包管理器 -> 程序包管理器控制檯,或者使用快捷鍵 ctrl + `)中輸入下面的命令。
Scaffold-DbContext "Server=192.168.1.22;User Id=jeremyjone;Password=123456;Database=db;" "Pomelo.EntityFrameworkCore.MySql" -OutputDir Models -force
其中,-OutPutDir
表示生成的類放在哪個文件夾,-force
表示如果文件夾中有同名文件,替換之。
輸入後確定,會直接創建出對應的實體模型和數據庫上下文。
包括下面的OnModelCreateing
函數,完全不用我們手寫,只需要稍加整理後,我們就可以直接使用了。
注入數據庫上下文
打開Startup.cs
文件,首先添加一個構造函數,將IConfiguration
注入:
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
然後在ConfigureServices
函數中,注入數據庫上下文:
// 首先取出appsettings中的連接字符串,注意參數名應與appsettings中鍵一致
var connectionString = Configuration.GetConnectionString("Database");
// 類型是生成的上下文類名
services.AddDbContext<MyDbContext>(options => options.UseMySql(connectionString));
此時已經可以正常訪問數據庫了,不過下面還要配置一個用於操作的倉庫
配置倉庫並注入
創建一個名爲Repositories
的文件夾,並在該文件夾下創建一個對應的操作接口,我的測試數據庫有一個Company表,所以我創建了一個ICompanyRepository.cs
接口:
public interface ICompanyRepository
{
Task<IEnumerable<Company>> GetCompaniesAsync();
Task<Company> GetCompanyAsync(int companyId);
void AddCompany(Company company);
Task<bool> SaveAsync();
}
然後Alt + Enter
直接生成實現類,並將其移動到新文件CompanyRepository.cs
中:
class CompanyRepository : ICompanyRepository
{
private readonly MyDbContext _myDbContext;
public CompanyRepository(MyDbContext myDbContext)
{
_myDbContext = myDbContext ?? throw new ArgumentNullException(nameof(myDbContext));
}
public async Task<IEnumerable<Company>> GetCompaniesAsync()
{
return await _myDbContext.Companies.ToArrayAsync();
}
public async Task<Company> GetCompanyAsync(int companyId)
{
return await _myDbContext.Companies.FirstOrDefaultAsync(x => x.Id == companyId);
}
public void AddCompany(Company company)
{
_myDbContext.Companies.Add(company);
}
public async Task<bool> SaveAsync()
{
return await _myDbContext.SaveChangesAsync() >= 0;
}
}
這裏只是簡單測試一下主要功能,所以添加一個Get和一個Post即可。
最後將倉庫注入,轉到Startup.cs
文件中,添加註入:
services.AddScoped<ICompanyRepository, CompanyRepository>();
數據庫的服務應該是以每一個HTTP請求爲請求週期的,所以使用Scoped。當然,使用其他方法也可以。
創建控制器
最後就是創建控制器。
添加一個名爲Controllers
的文件夾,並創建一個CompaniesController.cs
文件,實現三個方法:一個獲取全部,一個獲取單個,一個提交:
[ApiController]
[Route("api/companies")]
public class CompaniesController : ControllerBase
{
private readonly ICompanyRepository _companyRepository;
// 注入ComponanyRepository,就可以直接在控制器中使用其方法了
public CompaniesController(ICompanyRepository companyRepository)
{
_companyRepository = companyRepository;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<Company>>> GetCompanies()
{
var companies = await _companyRepository.GetCompaniesAsync();
return Ok(companies);
}
[HttpGet]
[Route("{companyId}", Name = nameof(GetCompany))]
public async Task<ActionResult<IEnumerable<Company>>> GetCompany(int companyId)
{
var company = await _companyRepository.GetCompanyAsync(companyId);
return Ok(company);
}
[HttpPost]
public async Task<ActionResult<Company>> CreateCompany([FromBody] Company company)
{
_companyRepository.AddCompany(company);
await _companyRepository.SaveAsync();
return CreatedAtRoute(nameof(GetCompany), new {companyId = company.Id}, company);
}
}
至此就完成了一個簡單的實體連接。之後的操作完全可以通過實體進行操作。後續還可以通過AutoMapper等工具對實體類進行映射等,這些更高級的操作,不在文本的討論範圍。