EF Core 初始化数据库的两种方法。
- 使用DbContextSeed初始化数据库
- 添加链接字符串
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//添加链接字符串
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddMvc();
} - 添加初始化数据类和方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace mvcforcookie.Data
{
using Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;//CreateScope()
public class ApplicationDbContextSeed
{
private UserManager<ApplicationUser> _userManager;
public async Task SeedAsync(ApplicationDbContext context, IServiceProvider service)
{
if (!context.Users.Any())
{
_userManager = service.GetRequiredService<UserManager<ApplicationUser>>();
//创建初始用户
var defultUser = new ApplicationUser()
{
UserName = "Administrator",
Email = "453151742@qq.com",
NormalizedUserName = "admin"
};
var result = await _userManager.CreateAsync(defultUser, "Password$123");
if (!result.Succeeded)
{
throw new Exception("初始用户创建失败");
}
}
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace mvcforcookie.Data
{
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
public static class WebHostMigrationExtensions
{
/// <summary>
/// 初始化database方法
/// </summary>
/// <typeparam name="TContext"></typeparam>
/// <param name="host"></param>
/// <param name="sedder"></param>
/// <returns></returns>
public static IWebHost MigrateDbContext<TContext>(this IWebHost host, Action<TContext, IServiceProvider> sedder)
where TContext : ApplicationDbContext
{
//创建数据库实例在本区域有效
using (var scope=host.Services.CreateScope())
{
var services = scope.ServiceProvider;
var logger = services.GetRequiredService<ILogger<TContext>>();
var context = services.GetService<TContext>();
try
{
context.Database.Migrate();//初始化database
sedder(context, services);
logger.LogInformation($"执行DbContext{typeof(TContext).Name} seed 成功");
}
catch ( Exception ex)
{
logger.LogError(ex, $"执行dbcontext {typeof(TContext).Name} seed失败");
}
}
return host;
}
}
} BuildWebHost时注入初始化函数
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; namespace mvcforcookie
{
using mvcforcookie.Data;
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args)
.MigrateDbContext<ApplicationDbContext>((context, services) =>
{ new ApplicationDbContextSeed().SeedAsync(context, services).Wait(); })
.Run();
} public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
- 添加链接字符串
- 使用services注入初始化数据库
- 添加Nuget包IdentityServer4.EntityFramework
- 添加链接字符串初始化dbcontext
public void ConfigureServices(IServiceCollection services)
{
var connectionstr = "Server=(localdb)\\mssqllocaldb;Database=IdentityServer4.EntityFramework;Trusted_Connection=True;MultipleActiveResultSets=true";
var migrationAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
// //添加identity
services.AddIdentity<ApplicationUser, ApplicationUserRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders(); services.AddIdentityServer()
.AddDeveloperSigningCredential()//添加证书
.AddConfigurationStore(options=> {//添加ConfigurationStore的配置存储claims
options.ConfigureDbContext = builder =>
{
builder.UseSqlServer(connectionstr, sql => sql.MigrationsAssembly(migrationAssembly));
};
})
.AddOperationalStore(options => {//添加OperationalStore的配置存储token的表格控制
options.ConfigureDbContext = builder =>
{
builder.UseSqlServer(connectionstr, sql => sql.MigrationsAssembly(migrationAssembly));
};
})
.AddAspNetIdentity<ApplicationUser>()//添加identityuser
.Services.AddScoped<IProfileService,ProfileService>();//添加profileservice
services.AddMvc();
} - 使用命令行初始化数据库
Add-Migration InitConfigurations -Context ConfigurationDbContext -OutputDir Data\Migrations\IdentityServer\Configuration Add-Migration InitPersistedGrant -Context PersistedGrantDbContext -OutputDir Data\Migrations\IdentityServer\PersistedGrantDb DBcontext 在 Identityserver4.EntityFramwork.DbContexts 命名空间下 Update-Database -Context ConfigurationDbContext Update-Database -Context PersistedGrantDbContext
- 添加初始化数据的方法
using System.Collections.Generic;
using System.Collections;
using IdentityServer4.Models;
using IdentityServer4.Test;
using IdentityServer4;
using System.Security.Claims; namespace mvcforcookie
{
public class Config
{
public static IEnumerable<ApiResource> GetApiResoure()
{
return new List<ApiResource>() { new ApiResource("api1", "My Api") };
}
public static IEnumerable<IdentityServer4.Models.Client> GetClients()
{
return new List<IdentityServer4.Models.Client>()
{
//正常情况下配置在数据库当中
new IdentityServer4.Models.Client() {
ClientId="MVC",
ClientName="MVC",
ClientUri="http://localhost:5001",
LogoUri="https://www.nicepsd.com/image/ec3594cb9bd94e13a7078b5da254591e/image.jpg",
AllowRememberConsent=true,//是否可以记住
//AllowedGrantTypes =GrantTypes.Implicit,//隐式 模式
AllowedGrantTypes =GrantTypes.HybridAndClientCredentials,
RequireConsent=true,//用户是否要确认
ClientSecrets={new Secret("Secret".Sha256())},//密鑰
AllowAccessTokensViaBrowser=true,
AllowOfflineAccess=true,
RedirectUris={ "http://localhost:5001/signin-oidc"},//客户端 登陆的url
PostLogoutRedirectUris={ "http://localhost:5001/signout-callback-oidc"},//登出地址
AlwaysIncludeUserClaimsInIdToken=true,//IdToken是否携带claims返回到客户端
AllowedScopes={
//使用identity4
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile
}
}
};
} public static List<TestUser> GetTestuser()
{
return new List<TestUser>(){new TestUser(){
SubjectId="",
Username ="cyao",
Password="oauth",
Claims =new List<Claim>{
new Claim("name","cyao"),
new Claim("webSite","www.baidu.com")
}
}};
} public static IEnumerable<IdentityResource> GetIdentityResource()
{
return new List<IdentityResource>(){
new IdentityResources.OpenId(),
new IdentityResources.Profile()
}; }
}
} 执行Init方法
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
//一定要先执行数据库生成命令然后执行初始化数据库
InitIdentityServerDataBase(app);//初始化数据库
app.UseStaticFiles();
// app.UseAuthentication();
app.UseIdentityServer();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
/// <summary>
/// 初始化数据库
/// </summary>
/// <param name="app"></param>
public void InitIdentityServerDataBase(IApplicationBuilder app) {
using (var scope=app.ApplicationServices.CreateScope()) {
scope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
var configurationDbContext = scope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
if (!configurationDbContext.Clients.Any())
{
foreach (var client in Config.GetClients())
{
configurationDbContext.Clients.Add(client.ToEntity());
}
configurationDbContext.SaveChanges();
}
if (!configurationDbContext.ApiResources.Any())
{
foreach (var api in Config.GetApiResoure())
{
configurationDbContext.ApiResources.Add(api.ToEntity());
}
configurationDbContext.SaveChanges();
}
if (!configurationDbContext.IdentityResources.Any())
{
foreach (var identity in Config.GetIdentityResource())
{
configurationDbContext.IdentityResources.Add(identity.ToEntity());
}
configurationDbContext.SaveChanges();
}
}
}
EF Core 初始化数据库的两种方法。的更多相关文章
- C++连接mysql数据库的两种方法
本文主要介绍了C++连接mysql数据库的两种方法,希望通过本文,能对你有所帮助,一起来看. 现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用a ...
- python学习--python 连接SQLServer数据库(两种方法)
1. python 学习.安装教程参照: http://www.runoob.com/python/python-tutorial.html 2. 集成开发环境 JetBrains PyCharm C ...
- python更新数据库脚本两种方法
最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 import MySQ ...
- 【Python】python更新数据库脚本两种方法
最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 1 import ...
- c#取数据库数据 ---两种方法
通常有以下两种方式 SqlDataReader 和SqlDataAdapter|DataSet方式 SqlDataReader 方式使用方式如下: using System; using System ...
- DataGridView编辑后立即更新到数据库的两种方法
DataGridView控件是微软预先写好的一个显示数据的控件,功能非常强大,可以显示来自数据库表的数据和XML等其他来源的数据. 方法一:基于DataAdapter对象创建一个CommandBuli ...
- iOS UIimage初始化时的两种方法
第一种方式:UIImage *image = [UIImage imageNamed:@"image"]; 使用这种方式,第一次读取的时候,先把这个图片存到缓存里,下次再使用时直接 ...
- MySQL 创建数据库的两种方法
使用 mysqladmin 创建数据库 使用普通用户,你可能需要特定的权限来创建或者删除 MySQL 数据库. 所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mys ...
- c#访问数据库的两种方法以及事务的两种方法
//2015/07/03 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
随机推荐
- squid之------基础知识
squid是什么? 缓存服务器,即用来存储(内存及硬盘)用户访问的网页.图片.文件等等信息的专用服务器,这种服务器不仅可以使用户最快的得到他们想要的信息,而且大大减少了网络传输的数据量,缓存服务器经常 ...
- python变量与常量内容:
''' python变量与常量内容: ''' # 变量:定义世间万物变化的状态 ''' height 180 weight 140 age 18 tree_name yuyang ''' # prin ...
- 炸弹:线段树优化建边+tarjan缩点+建反边+跑拓扑
这道题我做了有半个月了...终于A了... 有图为证 一句话题解:二分LR线段树优化建边+tarjan缩点+建反边+跑拓扑统计答案 首先我们根据题意,判断出来要炸弹可以连着炸,就是这个炸弹能炸到的可以 ...
- POJ-3020-Antena Placement(最小路径覆盖)
链接: https://vjudge.net/problem/POJ-3020 题意: The Global Aerial Research Centre has been allotted the ...
- shiro框架学习-2-springboot整合shiro及Shiro认证授权流程
1. 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- React native 之 async/await
参考资料 :https://www.jianshu.com/p/1e75bd387aa0 要点: 1. async function(){} 将普通函数转换成Promise 2. await 表达式/ ...
- PHP开发环境 PHP培训教程
PHP开发环境 兄弟连小编整理如下: Centos安装apache,mysql,php环境 yum -y install httpd php mysql mysql-server php- ...
- jquery even选择器 语法
jquery even选择器 语法 作用::even 选择器选取每个带有偶数 index 值的元素(比如 2.4.6).index 值从 0 开始,所有第一个元素是偶数 (0).最常见的用法:与其他元 ...
- SpringBoot项目中,表单的验证操作
在创建Springboot项目中,我们使用了表单验证操作,这一操作将极大地简化我们编程的开发 1.接收数据,以及验证 @PostMapping("/save") public Mo ...
- Java虚拟机之JVM调节参数
-XX:+PrintGC 使用这个参数,虚拟机启动后,每次GC就会打印日志. -XX:+UseSerialGC 使用串行垃圾回收器. -XX:+PrintGCDetails 打印详细信息.包括各个区的 ...