.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 ...
随机推荐
- bootstrap例子
<!DOCTYPE html> <html> <head> <title>Bootstrap 101 Template</title> &l ...
- php的ts和nts安装包
2017-12-29 15:17:05 星期五 翻译一下PHP对 ts , nts 的解释 官网说明地址: http://windows.php.net/download (windows下载页左 ...
- Razor视图基本语法
<!--Razor C#--> @for (int i = 0; i < 10; i++) { <baobao>good</baobao> } < ...
- 【原创】Linux基础之命令行浏览器links
有时服务器环境受限,比如在内网环境不能暴露端口从外网访问,用curl看html代码比较累,这时可以使用命令行浏览器来查看相关页面 links 官方:http://links.twibright.com ...
- 【原创】大数据基础之Logstash(2)应用之mysql-kafka
应用一:mysql数据增量同步到kafka 1 准备mysql测试表 mysql> create table test_sync(id int not null auto_increment, ...
- Github+HEXO FATAL bad indentation of a mapping entry at line 84
当配置玩_config.yml文件时,执行hexo g -d时出现错误如下: $ hexo g -d FATAL can not read a block mapping entry; a multi ...
- 如何去掉li标签的重叠边框
当我们的li标签设置了border的时候就会出现重叠边框,如何去掉呢,见代码 html代码 <ul class="friendLink_list"> <li> ...
- 1)django-建立步骤和目录说明
一:前言 django是python最流行的WEB框架. 二:django安装 pip install django 三:django项目建立步骤 1.创建django工程 django-admin ...
- swift 实践- 06 -- UITextView
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...
- jquery 获取和设置 select下拉框的值
获取Select : 获取select 选中的 text : $("#ddlRegType").find("option:selected").text(); ...