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 ...
随机推荐
- 区块链共识算法|RAFT和PBFT的区别
这里有个很形象的比喻: 一个团队一定会有一个老大和普通成员.对于 raft 算法,共识过程就是:只要老大还没挂,老大说什么,我们(团队普通成员)就做什么,坚决执行.那什么时候重新老大呢?只有当老大挂了 ...
- Java 集合类库
java类库的基本结构 Iterable public interface Iterable<T> 实现这个接口允许对象成为 "foreach" 语句的目标. 也就是说 ...
- zabbix命令之:zabbix_sender命令
zabbix server除了可以从客户端主动获取数据,客户端也可以主动将数据推送给服务端,客户端通过zabbix_sender指令来实现向服务端主动推送数据. 在zabbix客户端安装 配置yum源 ...
- Windows 7、Windows XP SP3关闭DEP堆栈执行保护
Windows XP SP3 在Windows XP SP3中,关闭DEP的方法是: 编辑C:\boot.ini,你大概会看到如下内容 [boot loader] timeout=30 default ...
- CMDB表结构设计
服务器 内存.cpu.disk.nic.raid.sn.model.os.status. disk_info = { } SERVER001 storage .... NET001 网络设备 eth ...
- linux-PXE-12
以DHCP+DNS模式管理服务器IP地址和主机名.服务器上架前,以其MAC地址为依据,在DHCP中配置主机保留并分配主机名.DHCP结合TFTP提供的PXE服务,提供PXE引导Linux内核和启动镜像 ...
- mysql 特殊符号
1.完全等于 <=> mysql> select null <=> null; +---------------+ | null <=> null | +-- ...
- springmvc请求参数异常统一处理,结合钉钉报告信息定位bug位置
参考之前一篇博客:springmvc请求参数异常统一处理 1.ExceptionHandlerController package com.oy.controller; import java.tex ...
- html address标签 语法
html address标签 语法 作用:定义文档作者/所有者的联系信息. 说明:如果 <address> 元素位于 <body> 元素内部,则它表示该文档作者/所有者的联系信 ...
- SpringBoot项目中,cookie的设置与销毁
cookie的设置与销毁 1.设置cookie /** * 设置一个cookie * @param response HttpServletResponse * @param name cookie的 ...