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 ...
随机推荐
- CentOS 7添加开机启动服务脚本
一.添加开机自启服务 在CentOS 7中添加开机自启服务非常方便,只需要两条命令(以Jenkins为例): systemctl enable jenkins.service #设置jenkins服务 ...
- 下载bat脚本
@rem 注释:从ftp服务器每小时下载北向性能文件的脚本 @rem 用vb脚本取昨天 for /f %%a in ('cscript //nologo yester.vbs') do set yes ...
- 循环结构——for语句、seq语句、while语句、break语句
1.for语句: 运行结果: 2.seq命令生成整数序列: 3.while语句: 执行结果: 4.break语句: break语句是正常结束之前退出当前循环. 执行结果: 5.continue语句: ...
- ESP8266 SPI通信
设备与设备之间的通信往往都伴随着总线的使用,而用得比较多的就当属于SPI总线和I2C总线,而恰巧NodeMcu也支持这两种总线通信 1. SPI总线——SPI类库的使用 SPI是串行外设接口(Seri ...
- MySQL数据表
创建数据表 CREATE TABLE IF NOT EXISTS ([列名column][类型type][约束可选]) 查看数据表结构 DESC <表名> 修改数据表结构 ALTER ...
- 8.django单独执行文件
import os import django # 导入django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'noju.settings')d ...
- MFC多文档获取窗口句柄
GET App AfxGetInstanceHandle() AfxGetApp() GET Frame->View->Document SDI AfxGetM ...
- Linux入门培训教程 linux下拷贝cp删除rm移动mv命令参数以及说明
拷贝移动删除在windows中看起来这么简单,但linux经常使用的文字界面,所以对于linux系统 下拷贝cp删除 rm 移动mv命令参数就不得不需要了解和学习了 cp 该命令的功能是将给出的文件或 ...
- 建立PHP的本地调试环境PHP基础教程
对于windows平台而言,PHP供给了一个安装程序,但是这个安装程序是不能直接运行来建立个人服务器平台的,而是必需嵌进现有的服务器平台,如:Windows NT下的IIS或Windows下的PWS, ...
- CDOJ 1063 堆排序模板
D - 秋实大哥与妹纸 Time Limit:1000MS Memory Limit:1500KB 64bit IO Format:%lld & %llu Submit Sta ...