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 ...
随机推荐
- jmeter+ant 实现自动化接口测试环境配置
前置:安装jdk 1.8以上 一.安装jemeter 下载地址:http://jmeter.apache.org/download_jmeter.cgi 1.1 解压jmeter,放在某个目录,例如D ...
- [bzoj4358]permu:莫队+线段树/回滚莫队
这道题是几天前水过去的,现在快没印象了,水一发. 首先我们看到它让求解的是最长的值域 连续段长度,很好. 然后就想到了山海经,但但是我还没有做. 然后又想到了很久以前的一次考试的T3旅馆hotel(我 ...
- python绘制国际象棋棋盘核心代码
import turtle step = 40 for i in range(8): for j in range(8): turtle.penup() turtle.goto(i*step, j*s ...
- Python分布式+云计算
参考: http://wiki.python.org/moin/ParallelProcessing http://wiki.python.org/moin/DistributedProgrammin ...
- React曾经忽略的知识点(下)
1.JSX渲染 想让类似 false.true.null 或 undefined 出现在输出中,你必须先把它转换成字符串 : <div> My JavaScript variable is ...
- Django基础之二(URL路由)
URL路由 简介 对于高质量的web应用来说,使用简洁,优雅的URL路由是一个值得尊重的细节,Django可以随心所欲的设计URL,不受框架的约束 为了给一个应用设计URL,你需要一个Python模块 ...
- 模板引擎ejs的include方法
html无法include header.ejs footer.ejs 最后用 user.ejs在首尾include
- List of Mozilla-Based Applications
List of Mozilla-Based Applications The following is a list of all known active applications that are ...
- C++ 左值与右值
https://baike.baidu.com/item/%E5%B7%A6%E5%80%BC%E4%B8%8E%E5%8F%B3%E5%80%BC/5537417?fr=aladdin https: ...
- word中打字会覆盖下一个字
insert键 误按了insert键,此时Word默认为改写模式,输入文本会覆盖后面的内容.