Entity Framework Core Code First 实践

任何一种技术的出现都是为了解决一系列特定的问题,只有了解了技术所要解决的关键问题,才能理解它的真正用途,之后,才能在实践中用好它。

Entity Framework Core也不列外,它的出现就是为了解决一个问题。在数据库的世界里面,关系型数据库从出现到现在一直是主流。而在面向对象编程的软件开发中 (Objects Oriented Programming),我们使用的频率最高的词是Object。那么,软件开发和数据库世界之间就存在明显的失配,怎么解决呢?我们可以使用object-relational mappers 或者简称为OR Mappers。在运用OR Mapper方面.NET比Java (NHibernate)晚了不是一点点,ADO.NET Entity Framework 就是微软开发的OR Mapper。 但是,我用的更多的是Entity Framework Core这个版本,要紧更技术的步伐,还有因为项目的需要。这些OR Mapper可以把数据库的表已经表之间的关系直接映射到Objects,让开发者不必再去手动做这些map了,哇,好省心!

前提条件

Windows 10 操作系统
安装 .NET Core SDK
执行以下命令,安装packages

dotnet tool install --global dotnet-ef
dotnet add package Microsoft.EntityFrameworkCore.Design

因为,我们将会使用它所包含的.NET CLI, 你可以使用在cmd里面输入 dotnet ef 来判断是否安装成功。CLI stands for Command Line Interface.

路径

打开cmd窗口,路径一般要指向项目根目录,确保在这个目录下包含了所有的Migration 文件。

常用操作命令

更新数据库

使用下面的命令更新数据库,每一次更新,都会把新的Migration文件中包含的更改,一起更新到数据库中,这是一个Append操作,不会覆盖已有的Migration,不会重建数据库。

dotnet ef database update

新建Migration

使用下面的命令新建一个Migration,这里的migration实际上就是Entities的改动。一般建议每一个Migration只包含单一的更改。

dotnet ef migrations add [NAME_of_MIGRATION]

Migration 文件实例

using System;
using Microsoft.EntityFrameworkCore.Migrations; namespace TravelDesk.Api.Data.Migrations
{
public partial class TrainOptions_RemoveColumns : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Conditions",
table: "TrainOptions"); migrationBuilder.DropColumn(
name: "Departure",
table: "TrainOptions"); migrationBuilder.DropColumn(
name: "Return",
table: "TrainOptions");
} protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "Conditions",
table: "TrainOptions",
nullable: true); migrationBuilder.AddColumn<string>(
name: "Departure",
table: "TrainOptions",
nullable: true); migrationBuilder.AddColumn<string>(
name: "Return",
table: "TrainOptions",
nullable: true);
}
}
}

Up 方法,是dotnet ef database update命令执行之后,即将要在数据库执行的更改
Down 方法,是在执行更新到某个特定版本是,数据库的回滚所需的更改

移除最新创建的Migration文件(或者是取消最新更改)

dotnet ef migrations remove

这个命令会移除最新创建的Migration文件,但它不会更新数据库。所以,如果这个更新已经被apply到了数据库中,这个操作是不能够删除数据库中的更改的。

高级操作

删除数据库

dotnet ef database drop

这个操作在项目开发中偶尔会用到,特别是出现Migration冲突,或者,发现很多更新都没有到本地数据库的时候。一般需要删除本地数据库,然后重建。

把数据库更新到特定的Migration

dotnet ef database update InitialCreate
dotnet ef database update 20180904195021_InitialCreate

以上操作会把数据库恢复到历史版本,也就是说,如果有1,2,3,4,5,6,7,8,9个migration, 在执行了一下命令之后

dotnet ef databae update 5

那么,5和之后的 6,7,8,9的migration都会回滚。注意,这个操作不会删除Migration文件,如果,你再次执行dotnet ef database update 操作,那么,更新会被再次应用到数据库中。

经验

尽量不要在Entity里面使用 new dateTime 或者 new GUID,合并代码的时候令人崩溃啊!

参考文献

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet
https://t-heiten.net/ef-core/reverting-a-migration/

Entity Framework Core Code First 项目实践的更多相关文章

  1. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

  2. Entity Framework Core Code First

    参考地址:https://docs.microsoft.com/zh-cn/ef/core/get-started/aspnetcore/new-db

  3. .net core Entity Framework Core Code First 框架 分层开发

    由于之前苦于无法把 Entityframework 跟Web层剥离.找了很久..找到了这个框架..分享给大家..  GitHub 地址:https://github.com/chsakell/dotn ...

  4. UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?

    选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软 ...

  5. ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.

    在ASP.Net Core 2.0的项目里, 我使用Entity Framework Core 2.0 作为ORM. 有人习惯把数据库的连接字符串写在appSettings.json里面, 有的习惯写 ...

  6. 在WebApi项目里使用MiniProfiler并且分析 Entity Framework Core

    在WebApi项目里使用MiniProfiler并且分析 Entity Framework Core 一.安装配置MiniProfiler 在现有的ASP.NET Core MVC WebApi 项目 ...

  7. 张高兴的 Entity Framework Core 即学即用:(一)创建第一个 EF Core 应用

    写在前面 Entity Framework Core (EF Core) 是 .NET 平台流行的对象关系映射(ORM)框架.虽然 .NET 平台中 ORM 框架有很多,比如 Dapper.NHibe ...

  8. 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)

    在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...

  9. AppBox升级进行时 - 拥抱Entity Framework的Code First开发模式

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. 从Subsonic到Entity Framework Subsonic最早发布 ...

随机推荐

  1. 【开发者portal在线开发插件系列一】profile和基本上下行消息

    前言: 开发者portal支持在线开发profile(即设备建模).在线开发插件.模拟应用管理设备.模拟设备上报数据接收命令.支持离线开发的profile和插件的上传部署,是合作伙伴快速集成设备.对接 ...

  2. [TimLinux] Linux shell获取进程pid

    调用脚本时,获取进程PID: (/this/is/a/script/file.sh > /out/to/log.txt & echo $!) & 脚本内部,获取进程PID: ec ...

  3. HDU1429

    Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...

  4. AcWing 291.蒙德里安的梦想

    题目:蒙德里安的梦想 链接:(蒙德里安的梦想)[https://www.acwing.com/problem/content/293/] 题意:求把N * M的棋盘分割成若干个1 * 2的长方形,有多 ...

  5. Orleans的深入

    1.序列化  序列化配置有几个坑这里我写出来 2.负载均衡 3.定时器与提醒 4.服务启动执行代码 5.监控 序列化 新建实体类 引用的包 Microsoft.Orleans.Core V2.12 M ...

  6. java中小数点位数

    import java.math.BigDecimal;import java.text.DecimalFormat;import java.text.NumberFormat;import java ...

  7. javascript基础(001)-js加减乘除注意事项(含类型转换)

    一,加减乘除注意事项: 1.任意类型'+'字符串都被强转字符串 2.数字和布尔类型'+'undefined 结果为 NaN (Not a Number) 3.'-','*','/'操作会尝试把数据转为 ...

  8. 《Java基础知识》Java注解"@"详解

    Java注解含义: Java注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的.Java注解又叫java标注,java提供了一套机制,使得 ...

  9. 如何"快准狠"找到内存相关的问题

    为了迅速定位内存问题,通常会先运行几个覆盖面比较大的性能工具,比如 free.top.vmstat.pidstat 等. 具体的分析思路主要有这几步 先用 free 和 top,查看系统整体的内存使用 ...

  10. 由malloc和new引发的段错误

    class Queue{ private: struct node{ string data; struct node * next,*priv; } private: struct node * p ...