.Net Core学习01 -EFCore(MySql DB First配置使用)

Target Framework : net 5.0

MySql version : 5.7

在.Net Core中,可以使用EF Core进行数据库操作,MySql也提供了相应的支持,要使用MySql作为数据库并且使用EFCore,首先需要安装相关的NuGet包,在Visual Studio中打开工具>NuGet包管理器>管理解决方案的NuGet程序包,搜索安装以下包:

Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Tools

接着打开工具>NuGet包管理器>程序包管理器控制台,输入以下代码安装MySql.EntityFrameworkCore,请注意如果项目的.Net Core版本是.Net 5则应该使用第一行进行安装,若采用.Net Core 3.1则使用第二行进行安装:

Install-Package MySql.EntityFrameworkCore -Version 5.0.0-m8.0.23
Install-Package MySql.EntityFrameworkCore -Version 3.1.10-m8.0.23

安装完成后,请编写一个连接字符串,连接字符串保存了连接数据库的一系列信息,一个简单示例如下:

"server=127.0.0.1;uid=root;pwd=12345;database=test"

在此示例中,该连接字符串被配置为使用数据库地址127.0.0.1、使用用户名 root、使用密码123456连接到MySQL服务器。所有语句的默认数据库将是数据库服务器的test数据库。根据自身的数据库配置进行编写。

接下来将要根据数据库中的数据表生成对应的实体类以及数据库上下文(DbContext)。打开程序包管理器控制台,输入以下命令进行生成:

Scaffold-DbContext "server=127.0.0.1;uid=root;pwd=123456;database=test" MySql.EntityFrameworkCore -OutputDir Models\DB -Context TestRepository -f

这段命令中,需要把刚刚编写的连接字符串替换进来,该命令将会在项目的根目录中名为Models的文件夹下的DB文件夹中创建相关的实体类和数据库上下文类(如果没有该文件夹的话将会自动创建),接着将会生成test数据库中的所有数据表对应的实体类,之后将会生成一个DbContext类,该类的名字由 -Context 参数指定,这里是TestRepository,-f参数则表明当发现文件夹中已经有同名的类时进行覆盖处理。如果需要进行更多的配置可以参考以下的参数列表进行配置,这些配置来自微软的EF Core文档,此处仅为参考,未来可能有所变动,请及时查阅最新文档:

参数描述
-Connection <String>用于连接到数据库的连接字符串。 对于 ASP.NET Core 2.x 项目,值可以是 name = <name of connection string> 。 在这种情况下,该名称来自为项目设置的配置源。 这是一个位置参数,并且是必需的。
-Provider <String>要使用的提供程序。 通常,这是 NuGet 包的名称,例如: Microsoft.EntityFrameworkCore.SqlServer 。 这是一个位置参数,并且是必需的。
-OutputDir <String>要放置生成的文件的目录,这个路径是一个以项目根目录为起点的相对目录。
-ContextDir <String>放置数据库上下文(DbContext)类的路径,同样也是一个以项目根目录为起点的相对目录,如果不指定,将会和 OutputDir 参数保持一致。
-Namespace <String>指定所有生成的类的命名空间。 默认值是从根命名空间和输出目录生成的。 EF Core 5.0 中添加此配置项。
-ContextNamespace <String>指定生成的DbContext类的命名空间。该配置会覆盖Namespace配置。 EF Core 5.0 中添加此配置项。
-Context <String>指定生成的DbContext类的类名。
-Schemas <String[]>The schemas of tables to generate entity types for. If this parameter is omitted, all schemas are included.
选择要生成实体类的表的schemas,如果不指定默认将会生成所有的表。
-Tables <String[]>The tables to generate entity types for. If this parameter is omitted, all tables are included.
选择要生成实体类的表的表名,如果不指定默认将会生成所有的表。
-DataAnnotationsUse attributes to configure the model (where possible). If this parameter is omitted, only the fluent API is used.
使用attributes配置模型(如果可能的话)。如果不指定则只会使用fluent API。
-UseDatabaseNamesUse table and column names exactly as they appear in the database. If this parameter is omitted, database names are changed to more closely conform to C# name style conventions.
使用数据表中的原始表名和列名作为生成的类中对应的名称,如果不写该配置项的话所有的表名和列名将会被自动转化为C#风格的命名。
-Force生成的文件将覆盖已有的同名文件。
-NoOnConfiguring不生成DbContext类的OnConfiguring方法。EF Core 5.0 中添加此配置项。
-NoPluralizeDon’t use the pluralizer. Added in EF Core 5.0.
位置参数是指,可以不写配置名称而按照顺序直接写值的参数。

生成实体类和数据库上下文之后,还需要在StartUp.cs中的ConfigureServices方法中进行服务配置,注意引入正确的命名空间:

services.AddDbContext<TestRepository>();

在使用时注入相应的DbContext即可使用。

最后还要说明一点,在管理解决方案的NuGet程序包中,还有一个极其相似的MySql.Data.EntityFrameworkCore包,这个包也是MySql提供的,但是在官方文档中表示只有对于早期版本的Connector / NET才会使用这个包,经测试.Net Core 3.1可以使用,但按照前述项目环境进行实际测试时,这个包无法使用,在生成实体类时会报错:

Method not found: 'Void Microsoft.EntityFrameworkCore.Storage.RelationalTypeMapping..ctor(System.String, System.Type, System.Nullable`1<System.Data.DbType>, Boolean, System.Nullable`1<Int32>)'.

因此推荐按照文档所述使用前述命令安装MySql.EntityFrameworkCore进行使用,并且如果两个包都安装的话,在自动生成的DbContext类的OnConfiguring方法中使用 optionsBuilder.UseMySQL 调用时将会报错CS0121,因为两个包中的同名类的同名方法函数签名一致,编译器无法判断应该调用哪一个,因此要避免同时安装这两个包。


参考资料:
微软文档中心:https://docs.microsoft.com/zh-cn/ef/core/cli/powershell#scaffold-dbcontext
MySQL文档:https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core-scaffold-example.html#connector-net-entityframework-core-scaffold-packagemgr

发表评论