.net core2.1 - ef core数据库迁移,初始化种子数据
起因:早上偶然看见一篇文章说是ef core(2.x)使用种子数据,主表子表迁移时候,正常情况下说是无法迁移成功,索性就试试,结果是和ef6的一样,没感觉有什么大的区别。一切OK,见下面内容。
1.首先我们依旧按照惯常的方式创建几个Entity实体对象,
如下图,几个实体应该不用说明什么意思,很显而易见,最下面的 UserRolePermission是role和permission的中间表,(多对多拆分一对一)
那么这里自然的就包含了主表和子表之间的主外键引用关系了。

2.然后依旧按照惯常方式创建一个Entity的实体对象的EntityTypeConfiguration对象,如下图:其中的 SeedData文件夹中的类是 EntityTypeBuilder的扩展类(看名字也知道了),主要放的就是种子数据了。

其中的 SeedData下的类内容:
public static class EntityTypeBuilderExtensions
{
#region permissionIds
private static Guid permissionId_01 = CombGuid.NewGuid();
private static Guid permissionId_02 = CombGuid.NewGuid();
private static Guid permissionId_03 = CombGuid.NewGuid();
private static Guid permissionId_04 = CombGuid.NewGuid();
private static Guid permissionId_05 = CombGuid.NewGuid();
private static Guid permissionId_06 = CombGuid.NewGuid();
private static Guid permissionId_07 = CombGuid.NewGuid();
private static Guid permissionId_08 = CombGuid.NewGuid();
private static Guid permissionId_09 = CombGuid.NewGuid();
private static Guid permissionId_10 = CombGuid.NewGuid();
private static Guid permissionId_11 = CombGuid.NewGuid();
private static Guid permissionId_12 = CombGuid.NewGuid();
private static Guid permissionId_13 = CombGuid.NewGuid(); #endregion #region roleId
private static Guid roleId_01 = CombGuid.NewGuid();
private static Guid roleId_02 = CombGuid.NewGuid();
private static Guid roleId_03 = CombGuid.NewGuid();
#endregion #region userExtensionId
private static Guid userExtensionId_01 = CombGuid.NewGuid();
#endregion public static EntityTypeBuilder HasDataPermissionSeed(this EntityTypeBuilder<PermissionSeed> builder)
{
var permissions = new List<PermissionSeed>()
{
new PermissionSeed(){ ID = permissionId_01,ControllerName="",ActionName="",IsDisabled=,OrderIndex=,Description=@"系统管理" },
new PermissionSeed(){ ID = permissionId_02,ControllerName="",ActionName="",IsDisabled=,OrderIndex=,Description=@"组织架构" },
new PermissionSeed(){ ID = permissionId_03,ControllerName="",ActionName="",IsDisabled=,OrderIndex=,Description=@"内容管理" },
new PermissionSeed(){ ID = permissionId_04,ControllerName="",ActionName="",IsDisabled=,OrderIndex=,Description=@"统计报表" }, new PermissionSeed(){ ID = permissionId_05,ParentPermissionID=permissionId_01,ControllerName="SystemSetting",ActionName="Index",IsDisabled=,OrderIndex=,Description=@"系统设置" },
new PermissionSeed(){ ID = permissionId_06,ParentPermissionID=permissionId_01,ControllerName="SystemSetting",ActionName="Other",IsDisabled=,OrderIndex=,Description=@"其他设置" }, new PermissionSeed(){ ID = permissionId_07,ParentPermissionID=permissionId_02,ControllerName="PermissionManager",ActionName="Index",IsDisabled=,OrderIndex=,Description=@"权限管理" },
new PermissionSeed(){ ID = permissionId_08,ParentPermissionID=permissionId_02,ControllerName="RoleManager",ActionName="Index",IsDisabled=,OrderIndex=,Description=@"角色管理" },
new PermissionSeed(){ ID = permissionId_09,ParentPermissionID=permissionId_02,ControllerName="UserManager",ActionName="Index",IsDisabled=,OrderIndex=,Description=@"用户管理" }, new PermissionSeed(){ ID = permissionId_10,ParentPermissionID=permissionId_03,ControllerName="ArticleManager",ActionName="Index",IsDisabled=,OrderIndex=,Description=@"文章管理" },
new PermissionSeed(){ ID = permissionId_11,ParentPermissionID=permissionId_03,ControllerName="VideoManager",ActionName="Index",IsDisabled=,OrderIndex=,Description=@"视频管理" }, new PermissionSeed(){ ID = permissionId_12,ParentPermissionID=permissionId_04,ControllerName="TongJiManager",ActionName="Index",IsDisabled=,OrderIndex=,Description=@"统计管理" },
new PermissionSeed(){ ID = permissionId_13,ParentPermissionID=permissionId_04,ControllerName="BaoBiaoManager",ActionName="Index",IsDisabled=,OrderIndex=,Description=@"报表管理" },
};
builder.HasData(permissions.ToArray());
return builder;
} public static EntityTypeBuilder HasDataRole(this EntityTypeBuilder builder)
{
var roles = new List<UserRole>() {
new UserRole(){ID = roleId_01,RoleName = @"超级管理员",IsDisabled = Entity.Enums.IsDisabled.UnDisable,CreateTime = DateTime.Now},
new UserRole(){ID = roleId_02,RoleName = @"管理员",IsDisabled = Entity.Enums.IsDisabled.UnDisable,CreateTime = DateTime.Now},
new UserRole(){ID = roleId_03,RoleName = @"金笔写手",IsDisabled = Entity.Enums.IsDisabled.UnDisable,CreateTime = DateTime.Now},
};
builder.HasData(roles.ToArray());
return builder;
} public static EntityTypeBuilder HasDataRolePermission(this EntityTypeBuilder builder)
{ var rolePermissions = new List<UserRolePermission>()
{
new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_01,UserRoleID = roleId_01} ,
new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_02,UserRoleID = roleId_01} ,
new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_03,UserRoleID = roleId_01} ,
new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_04,UserRoleID = roleId_01} ,
new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_05,UserRoleID = roleId_01} ,
new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_06,UserRoleID = roleId_01} ,
new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_07,UserRoleID = roleId_01} ,
new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_08,UserRoleID = roleId_01} ,
new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_09,UserRoleID = roleId_01} ,
new UserRolePermission(){ID = CombGuid.NewGuid(),PermissionSeedID = permissionId_10,UserRoleID = roleId_01}
};
builder.HasData(rolePermissions.ToArray());
return builder;
}
public static EntityTypeBuilder HasDataUserExtension(this EntityTypeBuilder builder)
{ var userExtensions = new List<UserExtension>() {
new UserExtension()
{
ID =userExtensionId_01,
AccountBalance=,
Integral = ,
ReadCoin =
}
};
builder.HasData(userExtensions.ToArray());
return builder;
}
public static EntityTypeBuilder HasDataUser(this EntityTypeBuilder builder)
{
var users = new List<User>() {
new User(){
ID = CombGuid.NewGuid(),CreateTime = DateTime.Now,Gender = Entity.Enums.GenderEnum.Man,HeadImage="",
IsDisabled = Entity.Enums.IsDisabled.UnDisable,LoginAccount = "thomas",LoginPassword="123qwe",NickName="thomas",
Remark = "seed初始化种子数据",Telphone="",UserRoleID = roleId_01,UserEctensionID=userExtensionId_01
},
new User(){
ID = CombGuid.NewGuid(),CreateTime = DateTime.Now,Gender = Entity.Enums.GenderEnum.Man,HeadImage="",
IsDisabled = Entity.Enums.IsDisabled.UnDisable,LoginAccount = "thomas",LoginPassword="123qwe",NickName="thomas",
Remark = "seed初始化种子数据",Telphone="",UserRoleID = roleId_01,UserEctensionID=userExtensionId_01
},
};
builder.HasData(users.ToArray());
return builder;
}
}
然后我们只需要在对应的 EntityTypeConfiguration直接使用扩展方法就行了,如下图其中一个示例:

3.那么至此,我们该创建的全创建完了,其他的,至于上下文对象(dbContext的创建),项目的创建(我这里创建的是一个web api项目),就省略了,,很简单。
4.开始我们的数据迁移操作:(我这里使用的sqlServer数据库)
说个题外话:我们在迁移的时候,可以在,DbContextOptionsBuilder (builder)builder.UseSqlServer这个扩展的时候,可以指定 migrations文件生成的所在目录,(当然这里会提示你事先需要实现IDesignTimeDbContextFactory这个接口,,比较简单,省略)
比如我直接指定生成在我的webapi的(presentation层,这也很合理,假设我如果使用的其他的数据库,比如sqlLite,这个builder就不是UserSQlServer了,是依据实际应用而定的)。
如图:

迁移: nuget 输入
add-migration init //不区分大小写,,哪来那么多要求,,
此时执行结果如下图:

然后看看我们项目里生成了啥(webapi)

5.目前我们成功生成了 迁移所需的迁移文件,但是还没迁移,这里如果 上下文没有设置 自动迁移的话,需要手动执行 updata-database去迁移生成数据库,
设置自动迁移:

或直接手动,继续在 nuget输入 updata-database即可,
看我们呢执行的结果:
PermissionSeed表:

User表:

Role表:

role和权限的中间表 rolePermission表:

再看看我们的主外键(其中一个):

一切OK,没有出现说无法正常初始化的问题,
.net core2.1 - ef core数据库迁移,初始化种子数据的更多相关文章
- EF Core 数据库迁移(Migration)
工具与环境介绍 1.开发环境为vs 2015 2.mysql EF Core支持采用 Pomelo.EntityFrameworkCore.MySql 源代码地址(https://github. ...
- [翻译 EF Core in Action 2.3] 理解EF Core数据库查询
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- EF Core新增迁移时无法加载程序集“System.ValueTuple”的错误
EF Core使用迁移命令时,如: Add-Migration Init 有时会出现如下错误: System.IO.FileLoadException: Could not load file or ...
- 基于EF创建数据库迁移
通过创建的实体类和DbContext类利用EF的Code First数据库迁移创建数据库. 下面看代码. 一.先创建实体类 我先添加一个BaseEntity,里面就一个属性 [Key] public ...
- .Net EF Core数据库使用SQL server 2008 R2分页报错How to avoid the “Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.”
一. 问题说明 最近.Net EF core 程序部署到服务器,服务器数据库安装的是SQL server 2008 R2,我本地用的的是SQL server 2014,在用到分页查询时报错如下: H ...
- .Net Core2.2 + EF Core + DI,三层框架项目搭建教程
笔记: 近两年.Net Core发展的很快,目前最新版为3.0预览版,之前在网上买了一本1.1版书籍都还没来得及看呢,估计现在拿出来看也毫无意义了.已多年.net工作经验,看书不如直接实际上手来得快, ...
- ABP Framework:移除 EF Core Migrations 项目,统一数据上下文
原文:Unifying DbContexts for EF Core / Removing the EF Core Migrations Project 目录 导读:软件开发的一切都需要平衡 动机 警 ...
- EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题
小故事 在开始讲这篇文章之前,我们来说一个小故事,纯素虚构(真实的存钱逻辑并非如此) 小刘发工资后,赶忙拿着现金去银行,准备把钱存起来,而与此同时,小刘的老婆刘嫂知道小刘的品性,知道他发工资的日子,也 ...
- (转载)EF 使用code first模式创建数据库和 填充种子数据
第一篇:来自 .net 开发菜鸟 博主的文章:https://www.cnblogs.com/dotnet261010/p/8035213.html 第二篇:来自 JustYong 博主的文章:htt ...
随机推荐
- linux下添加删除,修改,查看用户和用户组
一.组操作 1.创建组: groupadd test #增加一个test组 2.修改组 groupmod -n test2 test #将test组的名子改成test2 3.删除组 groupdel ...
- TechnoSoftware OPCDA client(1.2.1) Error Codes
OPCDA.NET Client Interface WrapperSummary of OPC Error Codes We have attempted to minimize the numbe ...
- Vue 实战项目开发流程
一 基础配备 ## 一.环境搭建 #### 1.安装node - 去[官网](https://nodejs.org/zh-cn/)下载node安装包 - 傻瓜式安装 - 万一安装后终端没有node环境 ...
- HDU 4455
题意 : 题目 给你一个序列 , 查询 t ,问 序列 连续 长度为 t 的子区间 的不同数 的和 巧妙的动态规划 数据大, Dp可以 O(n) #include<iostream> # ...
- oracle 定时 job
最近在工作中遇到了要在oracle里面创建一个定时job,从远程数据库里面定时把某张表里面的数据更新到本地服务器上某个表里,具体操作: 1.在自己数据库里面先创建一张表test create tabl ...
- 用docker快速搭建wordpress博客
WordPress是一个非常著名的PHP编写的博客平台,发展到目前为止已经形成了一个庞大的网站平台系统.在WP上有规模庞大的插件和主题,可以帮助我们快速建立一个博客甚至网站. 在Windows上可 ...
- (转载)(int)a、&a、(int)&a、(int&)a的区别,很偏僻的题
#include <iostream>#include <stdio.h>#include <string.h>#include <conio.h>us ...
- Struts2框架的概述及学习重点
什么是Struts2的框架 * Struts2是Struts1的下一代产品,是在 struts1和WebWork的技术基础上进行了合并的全新的Struts 2框架. * 其全新的Struts 2的体系 ...
- Oracle数据库内存使用情况分析查看
SGA.PGA使用情况 select name,total,round(total-free,2) used, round(free,2) free,round((total-free)/total* ...
- Confluence 6 与其他应用整合
你可以使用 应用链接(Application Links)将 Confluence 与其他应用进行整合.应用链接允许你连接 Confluence 到其他的应用,例如 JIRA 软件或者 JIRA 服务 ...