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 ...
随机推荐
- python中字符串格式化的两种方法
知识点汇总;1-字符串格式化输出方法一: % 1-print('名字是 %s,年龄是%s' % (name ,age)) 2- %s ---字符串-----相当于执行了str() 3- (name , ...
- 前后台入门系统搭建详解(springboot+angularjs)
1 . 搭建boot启动框架,这一步骤什么都不用添加,搭建完后框架如下: 2.因为是前后台项目,所以一般是需要有前台页面的,需要在后端maven依赖中加入web依赖包 spring-boot-star ...
- squid之------常用配置及选项
Squid常用命令 1.初始化在squid.conf里配置的cache目录 squid -z 2.对squid.conf排错,即验证squid.conf的语法和配置 squid -k parse 3. ...
- 前端每日实战:140# 视频演示如何用纯 CSS 创作文本的淡入动画效果
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ZMwgqK 可交互视频 此视频是可 ...
- C#Regex中replace方法的替换自定义小数点后的内容
$1应该就是引用了这个组,不用这个会匹配不到 /// <summary> /// 截取 /// </summary> /// <param name="n&qu ...
- python+selenium封装UI自动化框架
seleinum框架 框架的思想: 解决我们测试过程中的问题:大量的重复步骤,用自动化来实现 1)配置和程序的分离 2)测试数据和程序的分离 3)不懂编程的人员可以方便使用:使用的 ...
- CSS布局之flexbox
参考链接: https://www.cnblogs.com/qingchunshiguang/p/8011103.html 练习代码 <!DOCTYPE html> <html la ...
- Vim 命令、操作、快捷键(收藏大全)
------ 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filenam ...
- JMS学习十(ActiveMQ支持的传输协议)
ActiveMQ提供了一种连接机制,这种连接机制使用传输连接器(TransportConnector)实现客户端与代理(client - to - broker)之间的通信. 网络连接器(networ ...
- HDU3465--Life is a Line(树状数组求逆序数,离散化)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submission(s ...