EF Core中的DB First与Code First
前言:
大家都习惯在程序中生成对应的model来对数据库进行操作,所以如何快速的生成数据库表的对应model,是基础之一。总结了一下在我的认知中大概是这个结构:
Db first方式:
先创建好对应的数据库通过数据库来生成对应的Model。
1 创建数据库
大家可根据自己的需要生成对应的数据库,这里只做演示所以使用官方给的SqlServer数据库脚本:
CREATE DATABASE [Blogging];
GO
USE [Blogging];
GO
CREATE TABLE [Blog] (
[BlogId] int NOT NULL IDENTITY,
[Url] nvarchar(max) NOT NULL,
CONSTRAINT [PK_Blog] PRIMARY KEY ([BlogId])
);
GO
CREATE TABLE [Post] (
[PostId] int NOT NULL IDENTITY,
[BlogId] int NOT NULL,
[Content] nvarchar(max),
[Title] nvarchar(max),
CONSTRAINT [PK_Post] PRIMARY KEY ([PostId]),
CONSTRAINT [FK_Post_Blog_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blog] ([BlogId]) ON DELETE CASCADE
);
GO
INSERT INTO [Blog] (Url) VALUES
('http://blogs.msdn.com/dotnet'),
('http://blogs.msdn.com/webdev'),
('http://blogs.msdn.com/visualstudio')
GO
执行完了之后看一下效果:
表结构(极其简单):
需要的数据库创建完毕!
2 生成对应Model
在.net core核心包中已经包含了ef关于sqlserver的包,所以不需要导入任何包即可,如果你使用别的数据库则安装对应的包即可。在控制台中执行:
其中-OutputDir "Models"只将生成的文件放在Models中。
没什么问题,可以正常用了。
Code First方式:
先写好对应的Model,然后创建到数据库。
1 创建Model类
根据自己的需求写好类:
因为偷懒,所以只写了一个类。。。
2 创建DbContext
个人把DbContext理解为一个中控类,可以通过它来对数据库进行操作,这个可能理解有误。直接上图:
比较简单哈,把记得所有实体类都加进去就ok啦。
3 字段限制
3.1 特性限制
在正常的数据库中我们会对字段加许多的限制,比如长度最长为x,不可为空,设置主键等等。如果我们使用特性来进行约束那应该是这样的:
这样的话看上去比较混乱,用大佬们的话来说可能是职责不单一?应该是。总之这样是不好的。
3.2 Fluent API限制
所以我们要在DbContext中对字段进行限制,ef core有一套叫Fluent API的东西,比较方便,上图:
在OnModelCreating中加上限制之后和使用特性限制的效果是一致的。
3.3 限制类限制
但是当你的一个表字段比较多并且限制和表关系也非常多的时候,OnModelCreating中就会有很多行,不方便阅读,所以有了限制类(我自己起的..)这个东西:
继承于IEntityConfiguration,实现Configure方法,在这个方法中使用Fluent API进行限制就可以了,这样每个表的限制对应一个类比较方便阅读。
迁移命令
一种是使用CLI,一种是使用nuget,命令写法不一样而已,结果都一致。当然在这之前我们需要注入一下DbContext:
1 CLI方式:
在对应文件夹打开命令行执行dotnet ef migrations add name和dotnet ef database update 看结果:
我们需要的库已经建立完成了。
2 Nuget方法:
在nuget中执行:add-migration name和update-database即可,结果都一样不用看了。
迁移生成的文件介绍
第一次执行dotnet ef migrations add name时cli会自动创建migrations文件夹里面包含两个文件。
MyDbContextModelSnapshot文件是快照文件,记录第一次迁移时的数据库结构,以日期命名的文件为修改文件,记录每一次对数据库修改了哪些地方,如果迁移之后更新数据库之前发现还需要更改可以使用remove进行回滚。
具体回滚操作可使用:dotnet ef migrations remove
结语
只有在平时使用的时候,因为各种原因会遇到各种各样的奇葩问题,这里就不列举了,遇到的时候就得面向Search开发了,一般都是粗心错误,一般都能找到解决方案。
今天就先写到这里,希望可以帮到大家,如果帮不到就算我记笔记了。。。
相关资料
FluentAPI文档:https://www.learnentityframeworkcore.com/configuration/fluent-api
EFCore创建模型部分:https://docs.microsoft.com/zh-cn/ef/core/modeling/
官方案例:https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/new-db?tabs=visual-studio
EF Core中的DB First与Code First的更多相关文章
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
项目开发中的一些注意事项以及技巧总结 1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...
- EF Core中避免贫血模型的三种行之有效的方法(翻译)
Paul Hiles: 3 ways to avoid an anemic domain model in EF Core 1.引言 在使用ORM中(比如Entity Framework)贫血领域模型 ...
- 9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)
原文地址:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx EF 6 Code-F ...
- 9.4 翻译系列:EF 6以及 EF Core中的NotMapped特性(EF 6 Code-First系列)
原文链接:http://www.entityframeworktutorial.net/code-first/notmapped-dataannotations-attribute-in-code-f ...
- EF Core中怎么实现自动更新实体的属性值到数据库
我们在开发系统的时候,经常会遇到这种需求数据库表中的行被更新时需要自动更新某些列. 数据库 比如下面的Person表有一列UpdateTime,这列数据要求在行被更新后自动更新为系统的当前时间. Pe ...
- EF Core中如何通过实体集合属性删除从表的数据
假设在数据库中有两个表:Person表和Book表,Person和Book是一对多关系 Person表数据: Book表数据: 可以看到数据库Book表中所有的数据都属于Person表中"F ...
- 第五节:EF Core中的三类事务(SaveChanges、DbContextTransaction、TransactionScope)
一. 说明 EF版本的事务介绍详见: 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges.DBContextTransaction.TransactionScope). 本节主 ...
- 在ef core中使用postgres数据库的全文检索功能实战之中文支持
前言 有关通用的postgres数据库全文检索在ef core中的使用方法,参见我的上一篇文章. 本文实践了zhparser中文插件进行全文检索. 准备工作 安装插件,最方便的方法是直接使用安装好插件 ...
- [小技巧]EF Core中如何获取上下文中操作过的实体
原文地址:https://www.cnblogs.com/lwqlun/p/10576443.html 作者:Lamond Lu 源代码:https://github.com/lamondlu/EFC ...
随机推荐
- 基于Docker实现MySQL主从复制
前言 MySQL的主从复制是实现应用的高性能,高可用的基础.对于数据库读操作较密集的应用,通过使数据库请求负载均衡分配到不同MySQL服务器,可有效减轻数据库压力.当遇到MySQL单点故障中,也能在短 ...
- JMETER 用户变量作用域
在编写JMETER 脚本时,我们会使用到变量,变量的作用域是线程. 我们通过下面的脚本验证一下变量的返回是线程. 1. 我们先定义一个amount的流程变量. 2.线程组使用三个线程 3.在线程组中添 ...
- Linux系统中ps -l命令显示的英文含义
UID:启动这些进程的用户.PID:进程的进程ID.PPID:父进程的进程号(如果该进程是由另一个进程启动的).C:进程生命周期中的CPU利用率.STIME:进程启动时的系统时间.TTY:进程启动时的 ...
- linux驱动学习笔记---实现中断下半部以及驱动编写规范(七)【转】
转自:https://blog.csdn.net/weixin_42471952/article/details/81609141 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协 ...
- Ubuntu14 安装过程
系统:Description: Ubuntu 14.04.6 LTS平台:Oracle VM VirtualBox 先到阿里巴巴开源镜像站 https://opsx.alibaba.com/ 下 ...
- 201871010118-唐敬博 《面向对象程序设计(java)》第十五周学习总结
博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 <https://www.cnblogs.com/nwnu-daizh/> 这个作业的要求在哪里 <https://ww ...
- day45 作业
一.将当前日期按"2017-12-27 11:11 星期三"格式输出 function getdate(){ var d = new Date(); year = d.getFul ...
- c语言命名规范图
来自armbbs
- mysql修改windows下的data目录
在windows下,安装完mysql后,建议把数据目录(data目录)移动到非系统目录,避免系统出问题的时候还原. 1.在d盘创建一个mysqldata 2.给新文件增加权限NetworkServic ...
- 推荐一款运动步行App爱步行
推荐一款运动步行App爱步行 1 介绍 爱步行,是一款倡导健步运动.绿色生活.提升散步乐趣的APP,让大众在享受运动的同时,让用户的每一步都能产生价值.爱步行以步数为基础,用户在每天的行走过程中,可以 ...