当使用数据表结构作为模型来源时,我们很少手动去创建模型类。通常直接通过 EF Core 和 ORM 框架自动生成模型类。
本实验演示如何通过 EF Core 生成基于 MySQL sakila 数据库的模型类,以及如何在程序中使用这些模型类。
注:本实验需安装 .NET Core 2.0+,此处我安装的版本是 2.1.401。
创建控制台程序
创建名为 MyApp 的控制台程序,即通过 dotnet new console 在 Projects\MyApp 目录下创建一个控制台程序。
添加 EF Core 和相关包
终端运行
dotnet add package Microsoft.EntityFrameworkCore.Design
,成功后 MyApp.csproj 中将新增一行:<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.1.2" />
</ItemGroup>
运行
dotnet add package Pomelo.EntityFrameworkCore.MySql
来安装 EF Core 的 MySQL 驱动运行
dotnet add package Microsoft.EntityFrameworkCore.Tools.DotNet
来安装 EF Core 命令行工具注:如果你是 .NET Core 2.1 以下版本,你需要手动将 PackageReference 改为 DotNetCliToolReference
如果已升级至 2.1,则无需将 PackageReference 改为 DotNetCliToolReference
三个包安装完后,MyApp.csproj 如下:
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.1.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.1.2" />
</ItemGroup>
此时在终端里面运行 dotnet ef
就可以看到 EF Core 帮助文档。
运行下面的代码通过 EF Core 自动生成模型类:
dotnet ef dbcontext scaffold "Server=localhost;Database=sakila;Uid=YourUserName;Pwd=YourUserPassword;SslMode=none" "Pomelo.EntityFrameworkCore.MySql" -d -f -o Models
注:运行成功后会报四个 Warnging
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.
Could not find type mapping for column 'film.release_year' with data type 'year(4)'. Skipping column.
Could not find type mapping for column 'film.rating' with data type 'enum('G','PG','PG-13','R','NC-17')'. Skipping column.
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。
访问数据库
在 Program.cs 里面添加如下代码:
using System;
using MyApp.Models;
using System.Linq;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
var dbContext = new sakilaContext();
var actors = dbContext.Actor.ToList();
foreach (var a in actors)
{
System.Console.WriteLine($"ID:{a.ActorId} Name:{a.FirstName} {a.LastName}");
}
}
}
}
运行程序,终端打印所有的演员的 Id 和全名:
ID:1 Name:PENELOPE GUINESS
ID:2 Name:NICK WAHLBERG
ID:3 Name:ED CHASE
...
ID:199 Name:JULIA FAWCETT
ID:200 Name:THORA TEMPLE
代码链接:GitHub MyApp