当使用数据表结构作为模型来源时,我们很少手动去创建模型类。通常直接通过 EF Core 和 ORM 框架自动生成模型类。

本实验演示如何通过 EF Core 生成基于 MySQL sakila 数据库的模型类,以及如何在程序中使用这些模型类。

注:本实验需安装 .NET Core 2.0+,此处我安装的版本是 2.1.401。

创建控制台程序

创建名为 MyApp 的控制台程序,即通过 dotnet new console 在 Projects\MyApp 目录下创建一个控制台程序。

添加 EF Core 和相关包

  1. 终端运行 dotnet add package Microsoft.EntityFrameworkCore.Design,成功后 MyApp.csproj 中将新增一行:

    1. <ItemGroup>
    2. <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.1.2" />
    3. </ItemGroup>
  2. 运行 dotnet add package Pomelo.EntityFrameworkCore.MySql 来安装 EF Core 的 MySQL 驱动

  3. 运行 dotnet add package Microsoft.EntityFrameworkCore.Tools.DotNet 来安装 EF Core 命令行工具

    1. 注:如果你是 .NET Core 2.1 以下版本,你需要手动将 PackageReference 改为 DotNetCliToolReference

    2. 如果已升级至 2.1,则无需将 PackageReference 改为 DotNetCliToolReference

三个包安装完后,MyApp.csproj 如下:

  1. <ItemGroup>
  2. <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.1.2" />
  3. <PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
  4. <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.1.2" />
  5. </ItemGroup>

此时在终端里面运行 dotnet ef 就可以看到 EF Core 帮助文档。
2.5.1 Lab1 通过 MySQL 数据库生成 Models - 图1
运行下面的代码通过 EF Core 自动生成模型类:

  1. dotnet ef dbcontext scaffold "Server=localhost;Database=sakila;Uid=YourUserName;Pwd=YourUserPassword;SslMode=none" "Pomelo.EntityFrameworkCore.MySql" -d -f -o Models

注:运行成功后会报四个 Warnging

  1. The EF Core tools version '2.1.1-rtm-30846' is older than that of the runtime '2.1.2-rtm-30932'. Update the tools for the latest features and bug fixes.
  2. Could not find type mapping for column 'film.release_year' with data type 'year(4)'. Skipping column.
  3. Could not find type mapping for column 'film.rating' with data type 'enum('G','PG','PG-13','R','NC-17')'. Skipping column.
  4. Could not find type mapping for column 'film.special_features' with data type 'set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes')'. Skipping column.

第一句说 EF Core Tools 的版本比当前 .NET Core 版本低了,但这并不影响模型类的生成。后面三句是指在生成 Model 类时跳过了几列类型过于特殊无法自动映射为 C# 数据类型的列。

现在你就可以看到自动生成的 Models 文件夹和里面的各个模型类及用来访问数据库的代理 sakilaContext。
2.5.1 Lab1 通过 MySQL 数据库生成 Models - 图2

访问数据库

在 Program.cs 里面添加如下代码:

  1. using System;
  2. using MyApp.Models;
  3. using System.Linq;
  4. namespace MyApp
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. var dbContext = new sakilaContext();
  11. var actors = dbContext.Actor.ToList();
  12. foreach (var a in actors)
  13. {
  14. System.Console.WriteLine($"ID:{a.ActorId} Name:{a.FirstName} {a.LastName}");
  15. }
  16. }
  17. }
  18. }

运行程序,终端打印所有的演员的 Id 和全名:

  1. ID:1 Name:PENELOPE GUINESS
  2. ID:2 Name:NICK WAHLBERG
  3. ID:3 Name:ED CHASE
  4. ...
  5. ID:199 Name:JULIA FAWCETT
  6. ID:200 Name:THORA TEMPLE

代码链接:GitHub MyApp