.net core 3.x使用mysql EntityFramework

原文地址: 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表:

file

在程序包管理器控制檯(工具 -> NuGet包管理器 -> 程序包管理器控制檯,或者使用快捷鍵 ctrl + `)中輸入下面的命令。

Scaffold-DbContext "Server=192.168.1.22;User Id=jeremyjone;Password=123456;Database=db;" "Pomelo.EntityFrameworkCore.MySql" -OutputDir Models -force

其中,-OutPutDir表示生成的類放在哪個文件夾,-force表示如果文件夾中有同名文件,替換之。

輸入後確定,會直接創建出對應的實體模型和數據庫上下文。

file

file

包括下面的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等工具對實體類進行映射等,這些更高級的操作,不在文本的討論範圍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章