起因:早上偶然看见一篇文章说是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. wtforms-表单生成及验证

    介绍 wtforms是一个支持多个web框架的form组件,主要用来做表单的验证以及生成的, 安装 pip install wtforms 使用 自定义一个类,继承wtforms.Form类,定义字段 ...

  2. centos6.8配置php-fpm(php已在apache中以模块形式运行,nginx中同时以fastcgi运行)

    location ~ \.php(.*)$ { root /mnt/www/wenyin; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; ...

  3. windows类书的学习心得

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  4. HDU contest808 ACM多校第7场 Problem - 1008: Traffic Network in Numazu

    首先嘚瑟一下这场比赛的排名:59 (第一次看到这么多 √ emmmm) 好了进入正文QAQ ...这道题啊,思路很清晰啊. 首先你看到树上路径边权和,然后还带修改,不是显然可以想到 树剖+线段树 维护 ...

  5. C# 对话框使用整理

    1.保存文件对话框 SaveFileDialog saveFile = new SaveFileDialog(); saveFile.Title = "save file"; sa ...

  6. Linq与Lambda常用查询语法

    1.查询全部 2.按条件查询全部 3.去除重复 4.连接查询    between and 5.排序 6.分组

  7. java8 常用函数式接口

    public static void main(String[] args) { // TODO Auto-generated method stub //函数式接口 Function<Inte ...

  8. 基于官方mysql镜像构建自己的mysql镜像

    参考文章:https://www.jb51.net/article/115422.htm搭建步骤 1.首先创建Dckerfile: 1 2 3 4 5 6 7 8 9 10 11 12 FROM my ...

  9. 数据库-mysql-DDL-表记录操作

  10. Hystrix浅谈

    Hystrix如何使用很多说明,看了很多博客,却发现能说明一些简单概念的文章就没有. 所以本文不太回去说如何使用 Hystrix ,但是会简明的说一下 一些概念 super(Setter.withGr ...