前言:

大家都习惯在程序中生成对应的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的更多相关文章

  1. 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获

    项目开发中的一些注意事项以及技巧总结   1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...

  2. EF Core中避免贫血模型的三种行之有效的方法(翻译)

    Paul Hiles: 3 ways to avoid an anemic domain model in EF Core 1.引言 在使用ORM中(比如Entity Framework)贫血领域模型 ...

  3. 9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)

    原文地址:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx EF 6 Code-F ...

  4. 9.4 翻译系列:EF 6以及 EF Core中的NotMapped特性(EF 6 Code-First系列)

    原文链接:http://www.entityframeworktutorial.net/code-first/notmapped-dataannotations-attribute-in-code-f ...

  5. EF Core中怎么实现自动更新实体的属性值到数据库

    我们在开发系统的时候,经常会遇到这种需求数据库表中的行被更新时需要自动更新某些列. 数据库 比如下面的Person表有一列UpdateTime,这列数据要求在行被更新后自动更新为系统的当前时间. Pe ...

  6. EF Core中如何通过实体集合属性删除从表的数据

    假设在数据库中有两个表:Person表和Book表,Person和Book是一对多关系 Person表数据: Book表数据: 可以看到数据库Book表中所有的数据都属于Person表中"F ...

  7. 第五节:EF Core中的三类事务(SaveChanges、DbContextTransaction、TransactionScope)

    一. 说明 EF版本的事务介绍详见: 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges.DBContextTransaction.TransactionScope). 本节主 ...

  8. 在ef core中使用postgres数据库的全文检索功能实战之中文支持

    前言 有关通用的postgres数据库全文检索在ef core中的使用方法,参见我的上一篇文章. 本文实践了zhparser中文插件进行全文检索. 准备工作 安装插件,最方便的方法是直接使用安装好插件 ...

  9. [小技巧]EF Core中如何获取上下文中操作过的实体

    原文地址:https://www.cnblogs.com/lwqlun/p/10576443.html 作者:Lamond Lu 源代码:https://github.com/lamondlu/EFC ...

随机推荐

  1. 基于Docker实现MySQL主从复制

    前言 MySQL的主从复制是实现应用的高性能,高可用的基础.对于数据库读操作较密集的应用,通过使数据库请求负载均衡分配到不同MySQL服务器,可有效减轻数据库压力.当遇到MySQL单点故障中,也能在短 ...

  2. JMETER 用户变量作用域

    在编写JMETER 脚本时,我们会使用到变量,变量的作用域是线程. 我们通过下面的脚本验证一下变量的返回是线程. 1. 我们先定义一个amount的流程变量. 2.线程组使用三个线程 3.在线程组中添 ...

  3. Linux系统中ps -l命令显示的英文含义

    UID:启动这些进程的用户.PID:进程的进程ID.PPID:父进程的进程号(如果该进程是由另一个进程启动的).C:进程生命周期中的CPU利用率.STIME:进程启动时的系统时间.TTY:进程启动时的 ...

  4. linux驱动学习笔记---实现中断下半部以及驱动编写规范(七)【转】

    转自:https://blog.csdn.net/weixin_42471952/article/details/81609141 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协 ...

  5. Ubuntu14 安装过程

    系统:Description:    Ubuntu 14.04.6 LTS平台:Oracle VM VirtualBox 先到阿里巴巴开源镜像站 https://opsx.alibaba.com/ 下 ...

  6. 201871010118-唐敬博 《面向对象程序设计(java)》第十五周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 <https://www.cnblogs.com/nwnu-daizh/> 这个作业的要求在哪里 <https://ww ...

  7. day45 作业

    一.将当前日期按"2017-12-27 11:11 星期三"格式输出 function getdate(){ var d = new Date(); year = d.getFul ...

  8. c语言命名规范图

    来自armbbs

  9. mysql修改windows下的data目录

    在windows下,安装完mysql后,建议把数据目录(data目录)移动到非系统目录,避免系统出问题的时候还原. 1.在d盘创建一个mysqldata 2.给新文件增加权限NetworkServic ...

  10. 推荐一款运动步行App爱步行

    推荐一款运动步行App爱步行 1 介绍 爱步行,是一款倡导健步运动.绿色生活.提升散步乐趣的APP,让大众在享受运动的同时,让用户的每一步都能产生价值.爱步行以步数为基础,用户在每天的行走过程中,可以 ...