前言
因为官网文档中的数据同步都是基于Visual Studio 包管理控制台,或者使用dotnet-ef 命令,其原理都是基于项目原始结构目录与.cs 文件的,当在生产环境中,尤其是本地无法连接生产环境数据库且项目不允许拷贝到生产环境时,该如何同步能?接下来就为大家揭示这简单过程。
第一步当然是建立项目了
如下:DataMigration是数据库访问类库,主要是DbContenxt在他下面,Add-Migration 要在他下面执行,test-demo是我们的应用程序入口一个webApi程序
using Microsoft.EntityFrameworkCore;
namespace DataMigration
{
public class BaseDBContext : DbContext
{
public BaseDBContext() { }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySql("Data Source=localhost;Database=sync_platform;AllowLoadLocalInfile=true;User ID=root;Password=root;allowPublicKeyRetrieval=true;pooling=true;CharSet=utf8;port=3306;sslmode=none;", new MySqlServerVersion(new Version(5, 7, 36)));
}
public DbSet<TemplatePathInfo> CreateTemplatePath { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
/* Include modules to your migration db context */
builder.ConfigureTemplatePath();//模板
/* Configure your own tables/entities inside here */
}
}
}
using Microsoft.EntityFrameworkCore;
namespace DataMigration
{
public static class TemplateCreatingExtensions
{
public static void ConfigureTemplatePath(this ModelBuilder builder)
{
ConfigureTemplatePaths(builder);
}
private static void ConfigureTemplatePaths(ModelBuilder builder)
{
builder.Entity<TemplatePathInfo>(b => {
b.ToTable(TableNameCollection.TemplatePath);
b.Property(p => p.TId).IsRequired().HasDefaultValue("").HasMaxLength(64);
b.Property(p => p.Path).IsRequired().HasDefaultValue("").HasMaxLength(64);
});
}
}
}
第二步执行Add-Migration
打开程序包管理控制台,执行如下 Add-Migration init1,init1为名称自定义即可,但是执行过程中会报错,按照以下步骤基本都可以解决:
1.执行Add-Migration init1 目录要选择dbContext 所在项目
2.数据库访问类库,dbContext所在类库,与应用程序入口项目都引用如下工具包,如我的测试项目DataMigration与test-demo都要引用
3.当执行显示成功,且在DataMigration项目下生成Migrations目录和.cs文件说明初始化成功
第三步执行迁移
我的测试项目是另外写了一个迁移的控制台项目,实际使用中视情况而定,也可以直接写在项目的启动过程中,
控制台项目引用DataMigration
// See https://aka.ms/new-console-template for more information
using DataMigration;
using Microsoft.EntityFrameworkCore;
BaseDBContext baseDBContext= new BaseDBContext();
await baseDBContext.Database.MigrateAsync();
Console.WriteLine("Hello, World!");
至此数据同步完成。查看数据库
补充写在项目启动过程中,因为上下文注入是Scope注入,所以直接获取是获取不到的。
using (var se = app.Services.CreateScope())
{
using (var context = se.ServiceProvider.GetService<BaseDBContext>())
{
await context?.Database.MigrateAsync();
}
}