本章会主要了解EF提供的独立迁移项目,用独立迁移项目自动创建dgml设计关系图和sql脚本。
迁移项目通常也叫(CodeFirst代码优先),在EF中迁移项目是在,在代码中设计数据库,每次对数据库的设计都将被保留记录。这种模式只会向前修改,不会向后修改。因为一旦数据已经存在,不易删除改变结构,只能改列名和数据类型。反向工程通常也叫(DatabaseFirst数据库优先),是指数据库的结构已经创建好了,这包含表结构,只需从数据库映射到代码中。

独立迁移项目

独立迁移项目,因为这种方式是最优的,代码不会和业务代码混淆,所以这里只讲最优的方式和命令。
一共分为三个步骤如下,最后展示一个结果。

创建业务项目

新建类库项目,创建以下实体。引用 Microsoft.EntityFrameworkCore.Relational 包,创建 DbContext 配置模型。

public class School
{
    [Key]
    public int Id { get; set; }
    public List<Student> Students { get; set; }
    public List<Teacher> Teachers { get; set; }
}
public class Student
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Teacher> Teachers { get; set; }
}
public class Teacher
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Student> Students { get; set; }
}
public class DomainDbContext : DbContext
{
    public DbSet<School> School { get; set; }
    public DbSet<Student> Student { get; set; }
    public DbSet<Teacher> Teacher { get; set; }
    public DomainDbContext(DbContextOptions options) : base(options)
    {
    }
}

创建独立迁移项目

新建类库项目。项目名称以 XXXX.EFMigrations 结尾,这样能表示它是个EF迁移项目。
引用 上面的业务项目,再安装nuget包。Microsoft.EntityFrameworkCore.Design 是迁移工具的核心包。ErikEJ.EntityFrameworkCore.DgmlBuilder 是Dgml可视化关系图包,它是微软官方文档中推荐的。Microsoft.EntityFrameworkCore.SqlServer 是打算使用 SqlServer 数据库,可以换成别的数据库。

创建设计时 DbContext
public class DesignTimeDbContext : DomainDbContext
{
    public DesignTimeDbContext(DbContextOptions options) : base(options)
    {
    }
}
创建设计时工厂
public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<DesignTimeDbContext>
{
    public readonly string FullPath = @$"{Directory.GetCurrentDirectory()}\{nameof(DomainDbContext)}";
    public DesignTimeDbContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<DesignTimeDbContext>()
            .UseSqlServer();

        var context = new DesignTimeDbContext(builder.Options);

        if (args.Contains("dgml"))
        {
            File.WriteAllText(@$"{FullPath}.dgml", context.AsDgml());
        }
        if (args.Contains("sql"))
        {
            File.WriteAllText(@$"{FullPath}.sql", context.Database.GenerateCreateScript());
        }
        return context;
    }
}

独立迁移项目执行命令

dotnet ef migrations add InitialCreate -- dgml sql
-- 代表使用参数 args。使用了两个参数一个dgml 将在当前项目生成 dgml 关系图。sql 将生成sql脚本。
迁移命令请查阅官方文档迁移命令:https://learn.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli ,这里不叙述重复内容了。

结果

EF 管理数据库架构-LMLPHP

反向工程

目前的反向工程项目,最常用的是 EF Core Power Tools,是Visual Studio扩展。https://learn.microsoft.com/zh-cn/ef/core/extensions/#ef-core-power-tools 它是微软官方推荐。
在VS插件中安装后,右键项目会看到如下视图。
EF 管理数据库架构-LMLPHP

最后

整理了微软文档中的内容,参考微软文档如下:
https://learn.microsoft.com/zh-cn/ef/core/cli/dbcontext-creation?tabs=dotnet-core-cli
https://learn.microsoft.com/zh-cn/ef/core/extensions/#ef-core-power-tools
https://learn.microsoft.com/zh-cn/ef/core/extensions/#erikejentityframeworkcoredgmlbuilder
https://learn.microsoft.com/zh-cn/ef/core/managing-schemas。如有异议欢迎探讨。

07-29 17:08