Entity FrameworkCore (EF Core) 是一个轻量级的、可扩展的ORM(对象关系映射)框架,它允许.NET开发者以面向对象的方式来处理数据库操作。本文将介绍如何使用EF Core的命令行界面(CLI)工具来创建数据库,并在代码更改后进行迁移和更新数据库。
在讨论CLI工具之前,不得不提一下EFCorePowerTools,这是一个社区开源的图形界面工具,旨在支持与EF相关的操作。截至2023年5月,该工具仅提供了一些预览功能,对于这里的“Code First”方法并不实用。因此,将专注于官方的命令行接口(CLI)方法。
创建了一个.NET7的控制台应用程序作为示例。以下是应用程序的代码:
public class Person
{
public int Id { get; set; }
public string? Name { get; set; }
public int Age { get; set; }
public string? Address { get; set; }
}
public class Test1DbContext : DbContext
{
public Test1DbContext(DbContextOptions options) : base(options) { }
public DbSet Persons { get; set; }
}
public class Test1DbContextFactory : IDesignTimeDbContextFactory
{
static Test1DbContextFactory()
{
IConfiguration config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.Build();
connectionString = config["ConnectionStrings:Test1Connection"];
Console.WriteLine("ConnectionString:" + connectionString);
}
static string? connectionString = null;
public Test1DbContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder();
optionsBuilder.UseSqlServer(connectionString);
return new Test1DbContext(optionsBuilder.Options);
}
}
{
"ConnectionStrings": {
"Test1Connection": "Data Source=.;User Id=sa;Password=dbadmin1!;Initial Catalog=Test1;Encrypt=False"
}
}
如上所示,创建了一个名为Person的实体数据模型类。上下文Test1DbContext只包含一个DbSet
需要安装CLIEF Core工具并导航到项目文件夹。以下是需要的命令:
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef --version 7.0.5
cd C:\Tmp\Example3\Example3\
安装完成后,可以开始创建数据库。
现在可以开始实际工作了。首先需要创建迁移文件。需要以下命令:
dotnet ef migrations add Initial -o Migrations -c Example3.Test1DbContext
执行后,Migration文件夹将创建迁移文件。
要实际创建数据库,需要以下命令:
dotnet ef database update -c Example3.Test1DbContext
执行后,SqlServer数据库Test1将被创建,其中包含Persons表。同时,数据库表__EFMigrationsHistory将被创建,它跟踪哪些迁移已经被应用。
通常,随着时间的推移,可能想要更改实体数据模型。这里,将通过向Person类添加一个新属性来说明这一点。将向类中添加Profession属性。
public class Person
{
public int Id { get; set; }
public string? Name { get; set; }
public int Age { get; set; }
public string? Address { get; set; }
public string? Profession { get; set; }
}
现在情况是代码(实体数据模型)与数据库不同步。需要解决这个问题。
首先需要创建迁移文件。需要以下命令:
dotnet ef migrations add Work -o Migrations -c Example3.Test1DbContext
执行后,Migration文件夹中将创建20230530053706_Work.cs文件。
要实际更新数据库,需要以下命令:
dotnet ef database update -c Example3.Test1DbContext
执行后,SqlServer数据库Test1中的Persons表将创建Profession列。同时,数据库表__EFMigrationsHistory跟踪哪些迁移已经被应用。
将创建一些代码来测试EF生成的模型。以下是测试代码:
using Example3.EntityDataModel;
using Example3;
Console.WriteLine("Hello from Example3");
using Test1DbContext ctx = new Test1DbContextFactory().CreateDbContext(new string[0]);
Person per1 = new Person { Name = "Mark", Age = 33, Address = "Belgrade, Serbia", Profession = "Programmer" };
ctx.Persons.Add(per1);
ctx.SaveChanges();
Console.WriteLine("Table Persons ==================================");
foreach (var person in ctx.Persons)
{
Console.WriteLine("Id:" + person.Id.ToString() + " Name:" + person.Name);
}
执行后,将在数据库表Persons中看到新添加的数据。