起因:早上偶然看见一篇文章说是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数据库迁移,初始化种子数据的更多相关文章

  1. EF Core 数据库迁移(Migration)

    工具与环境介绍 1.开发环境为vs 2015 2.mysql EF Core支持采用  Pomelo.EntityFrameworkCore.MySql   源代码地址(https://github. ...

  2. [翻译 EF Core in Action 2.3] 理解EF Core数据库查询

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  3. EF Core新增迁移时无法加载程序集“System.ValueTuple”的错误

    EF Core使用迁移命令时,如: Add-Migration Init 有时会出现如下错误: System.IO.FileLoadException: Could not load file or ...

  4. 基于EF创建数据库迁移

    通过创建的实体类和DbContext类利用EF的Code First数据库迁移创建数据库. 下面看代码. 一.先创建实体类 我先添加一个BaseEntity,里面就一个属性 [Key] public ...

  5. .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 ...

  6. .Net Core2.2 + EF Core + DI,三层框架项目搭建教程

    笔记: 近两年.Net Core发展的很快,目前最新版为3.0预览版,之前在网上买了一本1.1版书籍都还没来得及看呢,估计现在拿出来看也毫无意义了.已多年.net工作经验,看书不如直接实际上手来得快, ...

  7. ABP Framework:移除 EF Core Migrations 项目,统一数据上下文

    原文:Unifying DbContexts for EF Core / Removing the EF Core Migrations Project 目录 导读:软件开发的一切都需要平衡 动机 警 ...

  8. EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题

    小故事 在开始讲这篇文章之前,我们来说一个小故事,纯素虚构(真实的存钱逻辑并非如此) 小刘发工资后,赶忙拿着现金去银行,准备把钱存起来,而与此同时,小刘的老婆刘嫂知道小刘的品性,知道他发工资的日子,也 ...

  9. (转载)EF 使用code first模式创建数据库和 填充种子数据

    第一篇:来自 .net 开发菜鸟 博主的文章:https://www.cnblogs.com/dotnet261010/p/8035213.html 第二篇:来自 JustYong 博主的文章:htt ...

随机推荐

  1. ObjectArx2013新建工程出错的解决办法

    最近将一个ObjectArx升级到Arx2013版,使用ObjectArx2013向导时,新建项目时弹出错误"未能加载项目文件.给定编码中的字符无效.第1行,位置1",经网上查找发 ...

  2. 题解-USACO18DEC Sort It Out

    Problem 洛谷5156 题意概要:给定一个长为\(n\)的排列,可以选择一个集合\(S\)使这个集合内部元素排到自己在整个序列中应该在的位置(即对于集合\(S\)内的每一个元素\(i\),使其排 ...

  3. Codeforces 675D Tree Construction Splay伸展树

    链接:https://codeforces.com/problemset/problem/675/D 题意: 给一个二叉搜索树,一开始为空,不断插入数字,每次插入之后,询问他的父亲节点的权值 题解: ...

  4. Mudo C++网络库第四章学习笔记

    C++多线程系统编程精要 学习多线程编程面临的最大思维方式的转变有两点: 当前线程可能被切换出去, 或者说被抢占(preempt)了; 多线程程序中事件的发生顺序不再有全局统一的先后关系; 当线程被切 ...

  5. ubuntu 远程登录错误

    利用  ubuntu 16.04 自带功能远程登录到同事的电脑时,提示如下错误: This file server type is not recognized 百度一下,得知,缺少必要的文件,安装后 ...

  6. 使用percona-xtrabackup工具对mysql数据库的备份方案

    使用percona-xtrabackup工具对mysql数据库的备份方案 需要备份mysql的主机 172.16.155.23存放备份mysql的主机 172.16.155.22 目的:将155.23 ...

  7. Windows10下Django虚拟环境配置和简单入门实例

    环境win10家庭版64位 + python 3.5 + Django 1.8.2 1.创建virtualenv目录 开始/运行/cmd回车,进入cmd窗口,到自己指定的目录下创建virtualenv ...

  8. 更新ocr voting后第二个节点启动不起来

    [+ASM2]@qdcx-db2[/home/grid]$crsctl check crs CRS-4638: Oracle High Availability Services is online ...

  9. Android获取本机号码及运营商

    import android.content.Context; import android.telephony.TelephonyManager; import android.util.Log; ...

  10. 【原创】Linux基础之文件编码

    查看 1 vi $ vi $file:set fileencoding 2 file $ file $file 修改 $ vi $file:set fileencoding=utf-8