起因:早上偶然看见一篇文章说是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. 牛客国庆训练,CCPC Camp DAY1 J 倍增,括号匹配

    https://www.nowcoder.com/acm/contest/201#question 题意:中文不翻译了 解法的个人理解: 对于一个合法的区间$[L,R]$ 1.显然其左括号的匹配位置都 ...

  2. PYTHON深拷贝与浅拷贝

    浅拷贝就是对引用的拷贝,深拷贝就是对对象的资源的拷贝 浅拷贝 浅拷贝仅仅复制了容器中元素的地址 赋值的原则 1.赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ). 2.修改不可 ...

  3. Ex 2_22 两个有序列表合并后的第k小元素..._第四次作业

    package org.xiu68.ch02; public class Ex2_22 { public static void main(String[] args) { // TODO Auto- ...

  4. Android调试adb devices找不到设备【转】

    adb驱动已经安装成功,但是adb devices却无法找到设备,USB大容量存储也是正常: 以前如果出现此种情况,我能想到的原因如下: 1.杀毒软件问题(关闭MacAfee) 2.驱动安装有误,重新 ...

  5. Fiddler 抓包工具

    序章 Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获.重发.编辑.转存等操作.也可以用来检测网络安全.反正好处多多,举之不尽呀!当年学习的时候也蛮费劲,一些蛮实用隐藏的 ...

  6. Affiliate实战记录之一:CPI、CPA、CPM...名词解释

    1.CPM (Cost Per Mille,或者Cost Per Thousand;Cost Per Impressions) 每千人成本,按展示次数收费 网上广告收费最科学的办法是按照有多少人看到你 ...

  7. PID控制器开发笔记之十:步进式PID控制器的实现

    对于一般的PID控制系统来说,当设定值发生较大的突变时,很容易产生超调而使系统不稳定.为了解决这种阶跃变化造成的不利影响,人们发明了步进式PID控制算法. 1.步进式PID的基本思想 所谓步进式PID ...

  8. Windows 批处理大全(附各种实例)

    Windows 批处理大全(附各种实例) 2009年07月19日 21:31:00 阅读数:2552 批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命 ...

  9. Confluence 6 审查日志

    日志审查能够允许管理查看你 Confluence 站点所做的修改.这个在你希望对你的 Confluence 进行问题查看或者是你希望对你 Confluence 保留重要的修改事件,例如修改了全局权限. ...

  10. Java语法基础常见疑惑解答

    1. 类是java的最小单位,java的程序必须在类中才能运行 2. java函数加不加static有何不同 java中声明为static的方法称为静态方法或类方法.静态方法可以直接调用静态方法,访问 ...