EF Core MySQL 数据库优先?

Posted

技术标签:

【中文标题】EF Core MySQL 数据库优先?【英文标题】:EF Core MySQL Database First? 【发布时间】:2018-09-05 13:47:03 【问题描述】:

我有一个位于 Amazon Cloud (RDS) 中的 mysql 数据库。这是一个只有一张表的小型数据库。

我想使用 EF Core,数据库优先。我知道Pomelo.EntityFrameworkCore.MySql 包很受欢迎,但我看不到任何有关如何通过该包实现 Db 上下文脚手架的信息。

我在这里关注instructions,同时将MySql.Data.EntityFrameworkCore.Design 替换为Pomelo.EntityFrameworkCore.MySql,但是当我在包管理器控制台中运行以下命令时:

Scaffold-DbContext "Server=my-db.rds.amazonaws.com;database=TestDb;uid=blah;pwd=blah;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -f

我刚刚收到错误:

无法解析指定的框架版本“2.0”

我错过了什么?这是我的虚拟解决方案的外观

【问题讨论】:

可能是bug,请将 EF Core 更新到最低 2.0.2 并重试。据我在您的链接文章中看到的,您也需要安装MySql.Data.EntityFrameworkCore。一种方法是从头开始遵循instructions,然后遵循数据库优先方法。 请注意,EF Core 确实不支持“数据库优先”方法。 Zameer 的答案中提到的Scaffold-DbContext 方法将基于现有数据库创建一个 DbContext 和模型,但是您应该从那里开始“代码优先”,因为在搭建脚手架后没有任何方法可以使用数据库更改来更新 DbContext。 【参考方案1】:

您需要在您的.csproj 中包含这些引用。当然,版本可能会有所不同。

<ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.0-preview2-final" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.0.1" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql.Design" Version="1.1.2" />
</ItemGroup>

<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.1.0-preview1-final" />
</ItemGroup>

注意:我必须手动将DotNetCliToolReference 添加到Microsoft.EntityFrameworkCore.Tools.DotNet(不是通过Visual Studio 中的Manage Nuget Packages 视图)

【讨论】:

【参考方案2】:

在 2020 年,随着 .net core 3 的发布,很多事情发生了变化,这就是现在的工作方式 :)

确保您拥有所有这些软件包

<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.1">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="3.1.1" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql.Design" Version="1.1.2" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" />

现在dotnet ef是需要安装的全局工具,reference

dotnet tool install --global dotnet-ef

然后运行这个命令,reference

dotnet ef dbcontext scaffold "Server=localhost;Database=ef;User=root;Password=123456;TreatTinyAsBoolean=true;" "Pomelo.EntityFrameworkCore.MySql"

对于不同路径的脚手架,可以使用--output-dir

dotnet ef dbcontext scaffold server=localhost;port=3306;database=palle2patnam;uid=root;password=password" "Pomelo.EntityFrameworkCore.MySql" --output-dir Models

为了强制从数据库中获取新字段,你可以添加 --force

dotnet ef dbcontext scaffold "server=localhost;port=3306;database=palle2patnam;uid=root;password=password" "Pomelo.EntityFrameworkCore.MySql" --output-dir Models --force

【讨论】:

【参考方案3】:

通过从工具中选择包管理器控制台或为解决方案管理 NuGet 包,然后选择 NuGet 包管理器菜单来安装以下 NuGet 包:

Microsoft.EntityFrameworkCore.Tools 2.0.1 版(适用于 EF Core 2.0)

Pomelo.EntityFrameworkCore.MySql 2.0.1 版

安装以上后在包管理器控制台中运行以下命令:

Scaffold-DbContext "你的连接字符串在这里" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -f

【讨论】:

以上是关于EF Core MySQL 数据库优先?的主要内容,如果未能解决你的问题,请参考以下文章

不同表共享相同字段时如何设计EF Core代码优先数据库

EF Core-1

从零开始自动递增 PK - EF Core 代码优先

EF Core - 代码优先迁移:关键字“NOT”附近的语法不正确

ef core 如何一次从具有外键的不同表中获取数据? (数据库优先)

text EF Core 2 - 代码优先迁移