目录
在.NET 5中使用Entity Framework Core 5数据迁移进行项目的逐步浏览。数据迁移位于单独的库中,并且会自动进行部署。
我一直在想写这个话题有一段时间了。我过去曾做过EF数据迁移的项目,但情况有所变化,它的库依存关系也发生了变化。现在,继续到现在,我将在.NET 5项目中以及EF Core 5(5.0.3)中进行此操作。
该博客的主要思想是您将使用Entity Framework编写一个Web应用程序,不仅如此,您还希望该项目附带一个数据迁移计划。编写应用程序时,数据库可能会随着时间的推移而发展,并且您希望在实时生产环境中优雅地逐步迁移数据库。这就是EF数据迁移发挥作用的地方。本文将分多个步骤逐步指导您。跳过所有其他编码方面,例如配置、编码标准、验证等,甚至实体框架建模,以使核心问题(数据迁移)更加清晰。
Microsoft允许从Visual Studio IDE模板或使用dotnet命令行(CLI)界面创建项目。在本文中,我们将通过dotnet CLI创建一个项目。此外,我们将使用Visual Studio Code而不是Visual Studio IDE,但是,用法仅限于编辑文件和浏览项目文件夹。所有构建和运行的应用程序都将通过dotnet CLI命令完成。这是一些先决条件:
我们将创建一个包含两个项目的解决方案,主项目将通过一个空的Web模板生成,另一个项目是一个库项目,其中包含我们的数据库模型,上下文以及稍后的迁移文件。在这里,我们将通过命令提示符使用dotnet CLI命令执行此操作,或者您可以从Visual Studio Code打开终端
mkdir EFCoreMigration
cd EFCoreMigration
dotnet new sln
这将使用当前目录的名称创建一个解决方案文件,或者您可以使用参数-n指定解决方案文件的名称:
dotnet new sln -n EFCoreMigration
dotnet new web -o WebApp
dotnet new classlib -o DataAccess
要查看每个可用的项目模板,可以使用以下方法列出它们:
dotnet new -l
dotnet sln add WebApp
dotnet sln add DataAccess
注意,如果不指定解决方案名称,它将使用默认名称(即当前目录的名称)。完整的命令可以像:
dotnet sln [solution name] add WebApp
或者,您也可以指定项目文件的完整路径,例如:
dotnet sln [solution name] add WebApp\WebApp.csproj
dotnet add WebApp reference DataAccess
或者,您也可以指定项目文件的完整路径:
dotnet add WebApp\WebApp.csproj reference DataAccess\DataAccess.csproj
在这里,我们使用实体框架的代码优先方法。使用了非常基本的模型。
using System;
namespace DataAccess
{
public class Book
{
public int Id { get; set; }
public string Name { get; set; }
public string Description {get;set;}
}
}
cd DataAccess
dotnet new package Microsoft.EntityFrameworkCore -v 5.0.3
using System;
using Microsoft.EntityFrameworkCore;
namespace DataAccess
{
public class DataContext: DbContext
{
public DbSet<Book> Books { get; set; }
public DataContext(DbContextOptions options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//Can add constraint, index, check, data type, and even data seed
}
}
}
dotnet build
dotnet new package Microsoft.EntityFrameworkCore.Sqlserver -v 5.0.3
using Microsoft.EntityFrameworkCore;
.......
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<DataAccess.DataContext>(options =>
options.UseSqlServer(
"Server=localhost;Database=EFCoreMigration;Trusted_Connection=True;"));
}
UseSqlServer是Microsoft.EntityFrameworkCore.SqlServer中的扩展方法,要使用它,您需要在顶部添加using Microsoft.EntityFrameworkCore。该代码将使用登录的用户帐户连接到MS SQL Server的本地实例,并创建一个EFCoreMigration数据库。
public void Configure(
IApplicationBuilder app,
IWebHostEnvironment env,
DataAccess.DataContext dataContext)
{
dataContext.Database.EnsureCreated();
dotnet run
public void Configure(
IApplicationBuilder app,
IWebHostEnvironment env,
DataAccess.DataContext dataContext)
{
dataContext.Database.EnsureCreated();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
using var dataContext = context.RequestServices
.GetService<DataAccess.DataContext>();
await context.Response.WriteAsync(
$"Book Count : {dataContext.Books.Count()}");
});
});
}
到目前为止,我们已经在代码中使用了Entity Framework,但是没有数据迁移功能。在大多数项目中,数据库可能会随着时间的推移而发展,因此我们可能需要提出一种随时间推移更改数据库的策略。Entity Framework Core具有数据迁移功能,下面是实现此功能的一种方法。
dotnet tool install --global dotnet-ef --version 5.0.3
这将允许我们运行dotnet ef 命令。
dotnet add Microsoft.EntityFrameworkCore.Design -v 5.0.3
using System;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore;
namespace DataAccess
{
public class DataContextFactory : IDesignTimeDbContextFactory<DataContext>
{
public DataContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<DataContext>();
//this code will be never executed in runtime only in design time
builder.UseSqlServer(
"Server=localhost;Database=EFCoreMigration;Trusted_Connection=True;");
return new DataContext(builder.Options);
}
}
}
dotnet ef migrations add InitialSchema
它将创建包含三个文件的Migrations目录:
InitialSchema 有两个方法,Up和Down。当将迁移应用于数据库时,将执行Up;当从数据库中删除迁移时,将执行Down。如果迁移应用到最新的迁移,则DataContextModelSnapshot包含数据库模型的快照。因此,如果添加或删除了新的迁移,则DataContextModelSnapshot.cs将被覆盖。
dotnet run
启用数据迁移后,下一个问题是必须对数据库模型进行更改时该怎么做。当然,数据库模型的变化范围很大,而且并非所有变化都具有相同的复杂性。但是,对于常见的更改情况,以下过程应该足够了。
dotnet ef migrations add [Your Own migration name]
dotnet ef migrations remove
然后,像平常一样部署。
https://www.codeproject.com/Articles/5294835/EF-Core-5-Data-Migration-in-NET-5-in-a-Separate-Li