EF Core中的DB First与Code First

Posted zyz-notes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章

ef code first db first 哪种好

EF中三大开发模式之DB First,Model First,Code First以及在Production Environment中的抉择

用于 ASP.NET Core 应用程序的 EF Code First 迁移替代方案

如何使用 EF Core Code-First 创建具有子类别的类别表? [复制]

EF Core开发模式之Code First

如何使用EF Core Code-First桥接自己的表