前言:

大家都习惯在程序中生成对应的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. 如何在unbuntu 16.04上离线部署openssh

    背景:由于部署环境不能联网,为了方便文件传输,需要用到openssh.故实施步骤是,先在可以联网机器上下载离线包,然后用U盘拷贝到部署环境中. 第一步:下载离线包,下载网址:https://packa ...

  2. XGBoost 完整推导过程

    参考: 陈天奇-"XGBoost: A Scalable Tree Boosting System" Paper地址: <https://arxiv.org/abs/1603 ...

  3. Oracle 11g R2 Sample Schemas 安装

    最近准备对之前学习SQL*Loader的笔记进行整理,希望通过官方文档中的示例学习(Case Studies)来进行,但是官方文档中示例学习相关的脚本文件在数据库软件安装完成之后默认并没有提供,而是整 ...

  4. 使用ruamel.yaml库,解析yaml文件

    在实现的需求如下: 同事提供了一个文本文件,内含200多个host与ip的对应关系,希望能在k8s生成pod时,将这些对应关系注入到/etc/hosts中. 网上看文档,这可以通过扩充pod中的hos ...

  5. docker 持久化存储

    1.data Volume  mysql5.7:dockerfile FROM debian:stretch-slim # add our user and group first to make s ...

  6. iptables防火墙的基本应用

    iptables是Linux上常用的防火墙软件,下面说一下iptables的安装.清除iptables规则.iptables只开放指定端口.iptables屏蔽指定ip.ip段及解封.删除已添加的ip ...

  7. 每天一道Rust-LeetCode(2019-06-11)

    每天一道Rust-LeetCode(2019-06-02) Z 字形变换 坚持每天一道题,刷题学习Rust. 题目描述 全排列 II 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输 ...

  8. c# 多线程多个参数

    for (int i = 0; i <count; i++) //根据选择的串口号数量创建对应数量的线程 { thread = new Thread(new ParameterizedThrea ...

  9. 11/9 <Stack> 155 232 225

    155. Min Stack class MinStack { int min = Integer.MAX_VALUE; Stack<Integer> stack = new Stack& ...

  10. [LeetCode] 83. Remove Duplicates from Sorted List 移除有序链表中的重复项

    Given a sorted linked list, delete all duplicates such that each element appear only once. Example 1 ...