Entity Framework Core 2.1,添加种子数据
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,添加种子数据的更多相关文章
- Entity Framework Core 导航属性 加载数据
Loading Related Data https://docs.microsoft.com/en-us/ef/core/querying/related-data Eager loading me ...
- UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?
选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软 ...
- 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 ...
- 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 ...
- 在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现
<在ASP.NET Core中使用Apworks快速开发数据服务>一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介 ...
- 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 ...
- Entity Framework Core系列之DbContext(添加)
上一篇我们介绍了Entity Framework Core系列之DbContext,对DbContext有了概念上的了解,这篇将介绍DbContext添加数据 通过DbContext添加实体的主要方法 ...
- ASP.NET CORE系列【六】Entity Framework Core 之数据迁移
原文:ASP.NET CORE系列[六]Entity Framework Core 之数据迁移 前言 最近打算用.NET Core写一份简单的后台系统,来练练手 然后又用到了Entity Framew ...
- 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 ...
随机推荐
- name属性作用+使用$.post()取代name属性在提交表单信息中的作用
name的用途 1)主要是用于获取提交表单的某表单域信息, 作为可与服务器交互数据的HTML元素的服务器端的标示,比如input.select.textarea.框架元素(iframe.frame. ...
- jQuery学习之旅 Item8 DOM事件操作
1.jquery页面载入事件 1.传统加载事件 <body onload="函数名()"> 页面全部html和css代码加载完成之后再调用指定的onload函数 win ...
- CSS3实现轴心为x轴的3D数字圆环
当做混合开发时,总有各种意想不到的酷炫效果的需求等着你.不过这个还好,先备着方便以后用. 先上效果图: 总结一下:此效果的完成基于以下几个关键点: 1.DOM结构,为每个DIV设置旋转后,一次也会影响 ...
- SimpleDateFormat安全的时间格式化
SimpleDateFormat安全的时间格式化 想必大家对SimpleDateFormat并不陌生.SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和 ...
- 【BZOJ 4652】【NOI 2016】循环之美
题目连接: 传送 题解: 真是一道好题…… 一: 一个分数$\frac{x}{y}$完全循环当其第一次出现时,当且仅当y与k互质,x与y互质,且y不等于1. 整数情况下y一定为1,即也满足以上判断. ...
- 在Jenkins中使用sonar进行静态代码检查
要解决的问题 jenkins自动构建完成后,希望能通过sonar静态代码检查生成一份报告,给与开发人员对当前代码的做一个质量评估和修改意见 1.安装并配置sonar服务器 懒得说,跟着官方文档走就行, ...
- Applet web端对文件的读取方式
转载:http://www.exam8.com/computer/Java/zonghe/200708/659876.html ---- 我们知道,在Java Applet中出于安全性考虑,Apple ...
- 对于单页应用中如何监听 URL 变化的思考
周末开发了一个在 GitHub 中给 repo 增加自定义备注的 chrome 扩展. 开发这个扩展的原因是我在 GitHub 中所 star 的项目实在太多了(截止目前 671 个),有的项目过个几 ...
- im2col:将卷积运算转为矩阵相乘
目录 im2col实现 优缺点分析 参考 博客:blog.shinelee.me | 博客园 | CSDN im2col实现 如何将卷积运算转为矩阵相乘?直接看下面这张图,以下图片来自论文High P ...
- 系统的讲解 - PHP 浮点数高精度运算
目录 概述 浮点数运算的"锅" 任意精度数学函数 常用数值处理方案 扩展 小结 概述 记录下,工作中遇到的坑 ... 关于 PHP 浮点数运算,特别是金融行业.电子商务订单管理.数 ...