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 ,三者各有千秋,依项 ...
随机推荐
- 用C#发送post请求,实现更改B站直播间标题[简单随笔]
第一次发这样的网络数据包.记录一下. API参考 https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/live/man ...
- ChatGPT在工业领域的研究与应用探索-数据与工况认知
1. ChatGPT发展现状... 2 2. ChatGPT如何与工业相结合... 2 3. ChatGPT在工业领域的研究与应用... 3 1. ChatGPT发展 ...
- Python LOG-日志
LOG https://www.cnblogs.com/yyds/p/6901864.html logging logging模块提供模块级别的函数记录日志 包括四大组件 1. 日志相关概念 日志 日 ...
- #Python 缺失值的检测与处理,处理部分
- 2022-08-22:给定一个数组arr,长度为n,最多可以删除一个连续子数组, 求剩下的数组,严格连续递增的子数组最大长度。 n <= 10^6。 来自字节。5.6笔试。
2022-08-22:给定一个数组arr,长度为n,最多可以删除一个连续子数组, 求剩下的数组,严格连续递增的子数组最大长度. n <= 10^6. 来自字节.5.6笔试. 答案2022-08- ...
- 2021-05-24:盛最多水的容器。给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai)
2021-05-24:盛最多水的容器.给你 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 ...
- 40% building 31/38 modules 7 active ...es\core-js\modules\es6.object.assign.jsBrowserslist: caniuse-lite is outdated.
一早运行项目发现不正常 虽然能运行,但是怎么看都不顺眼啊,那就照着提示先: npm update 一连串下来啥也看不懂是不是 我就直接npm install看看重新下载一下依赖结果直接给我来了个 :c ...
- Java网络编程----通过实现简易聊天工具来聊聊NIO
前文我们说过了BIO,今天我们聊聊NIO.NIO 是什么?NIO官方解释它为New lO,由于其特性我们也称之为,Non-Blocking IO.这是jdk1.4之后新增的一套IO标准.为什么要用NI ...
- js 字符串格式数组转为数组对象
工作中经常会遇到将json字符串转换为json对象,但是将字符串格式数组转为数组对象的场景却不多 如: 其中label_exp: "["cap_pop","wk ...
- 最流行的AI绘图工具Midjourney,你不得不知道的使用技巧
关注文章下方公众号,可免费获取AIGC最新学习资料 本文字数:1500,阅读时长大约:10分钟 Midjourney成为了最受欢迎的生成式AI工具之一.它的使用很简单.输入一些文本,Midjourn ...