.Net Core 3.1 Entity Framework Core Database First する方法


まえがき

.NetCore 3.1でMySQLでEntityFrameworkでDBファーストしようと思ったら
公式っぽいMySql.Data.EntityFrameworkCoreが3.1に対応していないせいで苦労した

開発環境

動作環境はcent7で.NetCore3.1なのだが使用ツールの関係で2.1も必要になる。

解法(ポイント)

  • Pomelo.EntityFrameworkCoreを使うこと
  • DBを読んでモデルを生成するMicrosoft.EntityFrameworkCore.Tools.DotNet Version="2.0.3" が.NetCore 2.x を要求してくる(2.1で動いたから良しとした)

後日談 2020/12
.Net5のみで動くようになってた
インストール方法は https://docs.microsoft.com/ja-jp/ef/core/cli/dotnet
コマンドで dotnet ef を dotnet-ef にすればOK

必要ライブラリは dotnet add package ~~~~ というコマンドで入れるのが正攻法だが
面倒なのでcsprojを以下のようにすして dotnet restore すればよい

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.2">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="MySql.Data.EntityFrameworkCore" Version="8.0.19" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="3.1.1" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql.Design" Version="1.1.2" />
  </ItemGroup>

</Project>

ライブラリの復元が完了したら以下のコマンドを実行すればDBモデルを生成してくれる
※接続情報は自分の環境に合わせること!

dotnet ef dbcontext scaffold "Server=localhost; Port=3306; Database=schema; Uid=root; Pwd=password;" Pomelo.EntityFrameworkCore.MySql -o Models --context Context

サンプルコード:github