EF 管理数据库架构
本章会主要了解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。如有异议欢迎探讨。
EF 管理数据库架构的更多相关文章
- asp.net core系列 30 EF管理数据库架构--必备知识 迁移
一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为 ...
- asp.net core系列 31 EF管理数据库架构--必备知识 反向工程
一. 反向工程 反向工程是基于数据库架构,生成的实体类和DbContext类代码的过程,对于Visual Studio开发,建议使用PMC.对于其他开发环境,请选择.NET Core CLI工具( ...
- 建立EF访问数据库架构时,出现One or more validation errors were detected during model generation
原因是因为我在写实体类的时候没有为实体类中的属性声明一个主键,即用[key]特性标注在属性上,这样DbContext才能为我们在数据库上找到对应的主键 using System.ComponentMo ...
- 8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解
本文出自8天掌握EF的Code First开发系列,经过自己的实践整理出来. 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LI ...
- 怎样在SharePoint管理中心检查数据库架构版本号、修补级别和修补程序的常规监控
怎样在SharePoint管理中心检查数据库架构版本号.修补级别和修补程序的常规监控 准备: 确保你是可以訪问管理中心的场管理员. 開始: 1. 打开管理中心--升级和迁移. 2. 点击"查 ...
- asp.net core 系列 21 EF现有数据库进行反向工程
一.概述 在上篇中使用EF基于数据模型创建数据库, 本篇继续使用 EF 基于数据库创建数据模型. 实现对已有数据库进行反向工程,来构建数据访问的 ASP.NET Core MVC 应用程序.已有 ...
- EF搭建数据库
http://blog.csdn.net/mss359681091/article/details/52135867http://blog.csdn.net/x_craft/article/detai ...
- Code First开发系列之管理数据库创建,填充种子数据以及LINQ操作详解
返回<8天掌握EF的Code First开发>总目录 本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to ...
- Asp.net MVC4 使用EF实现数据库的增删改查
EF的使用 步骤: (1)将EF添加到项目:在Model右击添加新建项 找到ADO.NET实体数据模型,接着... (2)实现数据库的增删改查 查询 (因为在Model中已经添加EF实体了 ...
- 转载Code First Migrations更新数据库架构的具体步骤
[转载] Code First Migrations更新数据库结构的具体步骤 我对 CodeFirst 的理解,与之对应的有 ModelFirst与 DatabaseFirst ,三者各有千秋,依项 ...
随机推荐
- linux下防火墙与SELinux状态与关闭
linux下防火墙与SELinux状态与关闭 在使用ftp命令以及wget命令测试两台linux机器之间ftp下载是否正常,虽然关闭了防火墙,但是一直还是提示以下错误 然来还需要将SELinux 设置 ...
- 【Vue2】NavigationDuplicated: Avoided redundant navigation to current location:xxxxx
翻译过来就是,导航重复:避免了到当前位置的冗余导航. 简单来说就是重复跳转了相同路径 原因 触发这种情况是因为vue-router中引入了primise,当传递了多次重复的参数就会抛出异常,而这种问题 ...
- Centos7 部署Django项目 uwsgi + nginx
启动 首先确保你的django项目是可以在虚拟环境中跑起来的,环境管理窝用的是pyenv,pyenv不知道什么东西的可以参考窝之前写过的Pyenv环境管理的安装文. 项目启动 python manag ...
- 文心一言 VS chatgpt (15)-- 算法导论3.2 4~5题
四.函数 $\lceil \lg n \rceil !$ 多项式有界吗?函数 $\lceil \lg \lg n \rceil !$ 多项式有界吗? 文心一言: chatgpt: 对于第一个问题,函数 ...
- 2023-03-27:avio_list_dir.c 是 FFmpeg 库自带的一个示例程序,它提供了列出目录中所有文件和子目录的功能,请用go语言改写。
2023-03-27:avio_list_dir.c 是 FFmpeg 库自带的一个示例程序,它提供了列出目录中所有文件和子目录的功能,请用go语言改写. 答案2023-03-27: 这段代码实现了通 ...
- 2022-11-06:给定平面上n个点,x和y坐标都是整数, 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。 返回最短距离,精确到小数点后面4位。
2022-11-06:给定平面上n个点,x和y坐标都是整数, 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的. 返回最短距离,精确到小数点后面4位. 答案2022-11- ...
- Element Cascader 级联选择器去除空叶子节点
此处以后端获取部门级联List为例 以下为数据结构 { data: { children: [ 0:{childre:[ 0:{}, 1:{} ]}, 1:{}, 2:{}, 3:{}, 4:{}, ...
- 2020-06-11-ASP.NET Core Blazor 子组件父组件数据同步的问题
上一篇写数据绑定的文章,写到最后留了一个坑.当子组件绑定父组件的一个字段,并且子组件修改它的时候父组件不能实时进行同步更新UI的问题,最近终于在Blazui作者的指导下搞定了. UserInfo类要实 ...
- 2023-05-20:go语言的slice和rust语言的Vec的扩容流程是什么?
2023-05-20:go语言的slice和rust语言的Vec的扩容流程是什么? 答案2023-05-20: go语言的slice扩容流程 go版本是1.20.4. 扩容流程见源码见runtime/ ...
- SpringCloud+Eureka初识+Ribbon+Feign+Hystrix(服务熔断,服务降级)+hashbroad
Eureka注册中心 1.导包 <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework ...