EFCore 2.1出来有一段时间了,里面的新功能还没怎么用,今天研究下如何使用EF Core 2.1添加种子数据。

这部分的官方文档地址是:https://docs.microsoft.com/en-us/ef/core/modeling/data-seeding

我们在开发时总是需要添加一些种子数据的,所以这个功能还是比较有用的。

准备工作

我建立了一个ASP.NET Core项目,里面有几个Model,其中一个是省份Province,另一个是城市City:

里面还涉及到其它的Model,不过本文用不到,就不贴了。

该项目使用的数据库是MSSQL LocalDB。并已经做好了上述Models的迁移工作。

该数据库里面存在过一些数据,但是现在都被我删除了。

添加第一个种子数据

直接在DBContext的OnModelCreating方法里使用HasData()方法:

这里我添加了一个省份的种子数据,并写上了主键Id的值

数据库该表的主键Id是int自增的。Id为1的数据曾经存在过,但是被我删除了。

然后看看会发生什么

生成的迁移类

命令:Add-Migration Xxx

看一下生成的迁移类的内容:

生成的SQL脚本

命令:Script-Migration

这是里面关于插入数据的部分:

迁移到数据库

命令:Update-Database -Verbose

结果是成功的。

看红线那两句话,EFCore在执行的过程中临时更改了设置,可以插入主键的值,然后又禁用了插入主键。

数据库里面的数据

虽然曾经存在过Id为1的数据(然后被删除了),但是Id为1的种子数据仍然可以插入进去。

种子数据的主键必须有值

我再添加一个没有主键Id值的种子数据:

然后Add-Migration,看看会发生什么:

报错了,所以主键值是必填的。

当我填写了主键值之后,一切都是好用的了:

更改现有的种子数据

我在HasData方法里更改了现有的种子数据,但是主键的值并没有改:

执行Update-Database时的SQL语句:

可以看到是根据主键对数据库里面的数据进行Update动作。

其结果也和我想的一样,就是更新了现有的数据:

如果我把HasData里种子数据的主键值修改了

我把四川的主键从2改为3。

看下生成的迁移文件:

先删除了之前添加的Id为2的种子数据,然后把插入了一笔Id为3的数据。

看下SQL:

也是先Delete,再Insert。

数据库里:

种子数据为什么要指定主键的值?

 因为在团队开发时,这样可以确保不同的开发人员、电脑、服务器上,在同一个迁移版本具有相同的种子数据

添加关联种子数据

Province和City是一对多的关系,也就是说一个Province可以有多个City,而且它们之间有导航属性。

下面看看一次性添加Province和City是否可以行,我直接在HasData方法里这样写:

然后Add-Migration

这样做不行。我必须单独添加City的种子数据,并且设置好外键

所以正确的做法是:

这次Add-Migration没有报错,迁移也成功了,看一下最后的数据:

OK

如果无法在Model里设置主键/外键

有时,我们在主从关系的Model里不明确定义外键;有时候我们Model的主键是private set的;

这时我们就无法在HasData里设置主键/外键的值了,那么如何来添加种子数据呢?

答案就是使用匿名类

我把City Model里的外键去掉(导航属性仍然保留,和Province的主从关系依然存在):

然后就可以这样添加种子数据:

迁移后的数据:

结果仍然如预期一样。

如果主键是Guid类型呢?

看下数据:

貌似没问题。

如果我不修改这个种子数据,再执行一次迁移呢?

看一下这时的迁移文件:

删除原来的数据,再插入一个新的数据。。

数据库里也是这样的:

所以最好的办法是把Guid的值放在一个变量里

然后再操作一遍:

这样就不会出现“把原有数据删掉,再重新插入”这种操作了。

其它

使用context.Database.EnsureCreated()会创建一个新的数据库,并包含有种子数据。但是如果数据库已经存在了,那么EnsureCreated()不会更新数据库,也不会添加种子数据了。

Entity Framework Core 2.1,添加种子数据的更多相关文章

  1. Entity Framework Core 导航属性 加载数据

    Loading Related Data https://docs.microsoft.com/en-us/ef/core/querying/related-data Eager loading me ...

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

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

  3. Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 更新关系数据

    Updating related data¶ 7 of 7 people found this helpful The Contoso University sample web applicatio ...

  4. Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 读取关系数据

    Reading related data¶ 9 of 9 people found this helpful The Contoso University sample web application ...

  5. 在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现

    <在ASP.NET Core中使用Apworks快速开发数据服务>一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介 ...

  6. ASP.NET Core 入门教程 8、ASP.NET Core + Entity Framework Core 数据访问入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...

  7. Entity Framework Core系列之DbContext(添加)

    上一篇我们介绍了Entity Framework Core系列之DbContext,对DbContext有了概念上的了解,这篇将介绍DbContext添加数据 通过DbContext添加实体的主要方法 ...

  8. ASP.NET CORE系列【六】Entity Framework Core 之数据迁移

    原文:ASP.NET CORE系列[六]Entity Framework Core 之数据迁移 前言 最近打算用.NET Core写一份简单的后台系统,来练练手 然后又用到了Entity Framew ...

  9. ASP.NET Core 入门笔记9,ASP.NET Core + Entity Framework Core 数据访问入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...

随机推荐

  1. latex中长公式换行,很好的办法

    今天在编辑公式时,有一个公式很长,写到一行就出去了.当时之前换行都是方程组或者在括号完之后换,都没有问题.但是今天我也换行的是在括号中间断开.这样出现问题,编辑的时候会出错误提醒.上网查了一些论坛,也 ...

  2. java-直接选择排序

    直接选择排序是一种简单的排序方法,它每次从当前待排序的区间中选择出最小的元素,把该元素与该区间的第一个元素交换. 第一次从a[0]~a[n-1]中选取最小值,与a0]交换,第二次从a[1]~a[n-1 ...

  3. MySQL 8 新特性之降序索引

    MySQL 8.0终于支持降序索引了.其实,从语法上,MySQL 4就支持了,但正如官方文档所言,"they are parsed but ignored",实际创建的还是升序索引 ...

  4. fiddler抓包软件的使用--请求头--ajax

    User-Agent: FiddlerHost: localhost:49828Content-Length: 0Accept: application/xmlContent-Type: applic ...

  5. Java中的异常简介

    Java中异常的分类 Java中的异常机制是针对正常运行程序的一个必要补充,一般来说没有加入异常机制,程序也能正常运营,但是,由于入参.程序逻辑的严谨度,总会有期望之外的结果生成,因此加入异常机制的补 ...

  6. EffictiveC++笔记 第3章

    Chapter 3 资源管理 条款13: 以对象管理资源 有时即使你顺利地写了对应对象的delete语句,但是前面的区域可能会有一个过早的return语句或者抛出了异常.它们一旦执行,控制流绝不会触及 ...

  7. 前端学习笔记之HTML body内常用标签

    阅读目录 一 HTML语义化 二 字符实体 三 h系列标签 四 p标签 五 img标签 六 a标签 七 列表标签 八 table标签 九 form标签 一 HTML语义化 body中的标签是会显示到浏 ...

  8. 开源)嗨,Java,你可以生成金山词霸的二维码分享海报吗?

    As long as you can still grab a breath, you fight.只要一息尚存,就不得不战. 有那么一段时间,我特别迷恋金山词霸的每日一句分享海报.因为不仅海报上的图 ...

  9. 从壹开始前后端分离 39 || 想创建自己的dotnet模板么?看这里

    缘起 开工是利啦!哈喽各位小伙伴,周三好呀,新的一年又开始了,老张给大家做个榜样,新的一年也要好好学习哟,这两天闲的无事就整理整理了这个系列的 Github 代码,增加了一个英文的 README ,然 ...

  10. redis的bigkey扫描脚本

    众所周知,redis里面的大key存在是非常危险的一件事情.因为最近的工作转移到中间件相关的工作,因此关注了一下bigkey的扫描方法.首先介绍一下阿里云提供的扫描脚本: 具体可见:https://y ...