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()不会更新数据库,也不会添加种子数据了。

原文地址:https://www.cnblogs.com/cgzl/p/9868501.html

时间: 2024-10-06 02:12:01

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

Entity Framework Core系列教程-6-查询数据

Entity Framework Core中的查询 Entity Framework Core中的查询与EF 6.x中的查询相同,但具有更优化的SQL查询,并且能够将C#/ VB.NET函数包含在LINQ到实体查询中. Entity Framework Core 允许你在模型中使用导航属性来加载相关实体. 有三种常见的 O/RM 模式可用于加载关联数据: Eager loading (预先加载): 表示从数据库中加载关联数据,作为初始查询的一部分. Explicit loading(显式加载):

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

选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软推荐使用Sqlite吧! 2,简单!就只有一个类库没有多余的参照什么的.不像其他数据库还得做复杂配置什么的麻烦! 3,不需要数据库服务,数据服务和客户都在同一个进程里面.如下图: 4,作为存储系统它只支持一个用户一个数据实体. 5,跨平台跨结构,这个好! Sqlite主要使用内容 如果想充分使用好S

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

创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添加一个User类: namespace MyFirstApp.Models { public class User { public int ID { get; set; } public string Name { get; set; } public string Email { get; se

[UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)

前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Entity Framework Core(Entity Framework 7)下文将简称:EF 1.在UWP中使用EF需要更新Microsoft.NETCore.UniversalWindowsPlatform到大于“5.2.2”的版本. 2.直接在“程序包管理器控制台”输入命令来更新:Update-P

使用Entity Framework Core Code First创建SQLite数据库

Entity Framework Core(以下简称"EF Core")支持多种数据库.在这篇文章中,我们看看如何使用EF Core的Code First方式创建SQLite数据库 下载SQLite,解压后会得到三个文件,放到c:\sqlite目录下 我们先创建一个.NET Core控制台程序 添加EF Core for SQLite组件库 "dependencies": { "Microsoft.EntityFrameworkCore.Sqlite&qu

Entity Framework Core的贴心:优雅处理带默认值的数据库字段

对于用于保存记录添加时间的数据库日期字段,我们通常会设置一个 GETDATE() 的默认值,而不是在应用程序的代码中获取当前时间进行保存,这样可以避免由于web服务器时钟不同步引起的时间偏差. Entity Framework Core 在设计时贴心地考虑到这个场景,提供了 .HasDefaultValueSql() 映射配置,今天在实际开发中体检了一下,的确管用. 比如下面的数据库表中 DateAdded 与 IsActive 这2个字段分别设置了默认值: CREATE TABLE [dbo]

NET Core & Entity Framework Core

本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 官方文档分四部分 一. 教程文档 二.ABP 框架 三.zero 模块 四.其他(中文翻译资源) 本篇是第一部分的第一篇. 第一部分分三篇 1-1 手把手引进门 1-2 进阶 1-3 杂项 (相关理论知识) 第一篇含两个步骤. 1-1-1 ASP.NET Core & Entity Framework Core 后端(内核)含两篇 (第二篇链接) 1-1-2 ASP.NET MVC, Web API, EntityFramework &

Entity Framework Core 2.0 入门简介

不多说废话了, 直接切入正题. EF Core支持情况 EF Core的数据库Providers: 此外还即将支持CosmosDB和 Oracle. EFCore 2.0新的东西: 查询: EF.Functions.Like() Linq解释器的改进 全局过滤(按类型) 编译查询(Explicitly compiled query) GroupJoin的SQL优化. 映射: Type Configuration 配置 Owned Entities (替代EF6的复杂类型) Scalar UDF映

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

前言 最近打算用.NET Core写一份简单的后台系统,来练练手 然后又用到了Entity Framework Core 发现园子里有些文章讲得不是那么细节,对于新手小白来说,可能会有点懵. 特意整理了几个细节. 正文 数据迁移 首先EF CORE跟以前的EF6是有不同点的, 微软官网列出的不同点:https://docs.microsoft.com/zh-cn/ef/efcore-and-ef6/features 安装 EF 核心 NuGet 包 若要使用 EF 核心,请为你想要使用的数据库提