前言:

大家都习惯在程序中生成对应的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. pdfium舍弃v8依赖

    Step 3 去除v8依赖 用文本编辑器打开pdfium根目录下的pdfium.gyp文件,找到'javascript'及'jsapi'依赖(47行左右): 'dependencies': [ 'sa ...

  2. python 一些程序规范(跨目录调用文件)

    文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 参考: https://www.cnblogs.com/monologuesmw/p/9490093.html 软件 ...

  3. 201871010112-梁丽珍《面向对象程序设计(java)》第八周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  4. 精通awk系列

    安装新版本gawk awk有很多种版本,例如nawk.gawk.gawk是GNU awk,它的功能很丰富. 本教程采用的是gawk 4.2.0版本,4.2.0版本的gawk是一个比较大的改版,新支持的 ...

  5. 通过Socket实现TCP编程(十二)

    原文链接:https://www.cnblogs.com/hysum/p/7531529.html Socket通信 : TCP协议是面向对象连接.可靠的.有序的,以字节流的方式发送数据. 基于TCP ...

  6. win10 配置 hadoop-2.7.2

    win10 配置 hadoop-2.7.2 1.下载 先在 http://acrchive.apache.org/dist/hadoop/common/hadoop-2.7.2/hadoop-2.7. ...

  7. Spark & Scala:

    https://blog.csdn.net/do_yourself_go_on/article/details/76033252 Spark源码之reduceByKey与GroupByKey     ...

  8. luoguP3455 [POI2007]ZAP-Queries

    题意 设\(f(n)=\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}[gcd(i,j)==n],F(n)=\sum\limits_{n|d}f(d)\) 发现\( ...

  9. 每天一道Rust-LeetCode(2019-06-10)

    每天一道Rust-LeetCode(2019-06-02) Z 字形变换 坚持每天一道题,刷题学习Rust. 题目描述 https://leetcode-cn.com/problems/simplif ...

  10. 关于gcd

    内容: \(gcd(a,b)=gcd(b,a\% b)\) 用途: 这不废话嘛,当然是用来求最大公约数啊 证明:(这还是四月份的时候cdx巨佬给我讲的qwq) 设\(d=gcd(a.b)\) 则有\( ...