本章会主要了解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 Core Power Tools,是Visual Studio扩展。https://learn.microsoft.com/zh-cn/ef/core/extensions/#ef-core-power-tools 它是微软官方推荐。
在VS插件中安装后,右键项目会看到如下视图。
最后
整理了微软文档中的内容,参考微软文档如下:
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。如有异议欢迎探讨。