entity-framework - 尝试在 .net 核心的代码中迁移表
问题描述
我正在使用Aspnet.Identity设置IdentityServer4。我遵循了一个教程,该教程展示了如何在代码中创建数据库和种子。我有一个看起来像这样的方法:
public static void SeedIdentityServerDatabase(this IApplicationBuilder app)
{
using (var scope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var serviceProvider = scope.ServiceProvider;
var persistedGrantDbContext = serviceProvider.GetRequiredService<PersistedGrantDbContext>();
var configurationDbContext = serviceProvider.GetRequiredService<ConfigurationDbContext>();
persistedGrantDbContext.Database.Migrate();
configurationDbContext.Database.Migrate();
CreateIdentityResources(configurationDbContext);
CreateApiResources(configurationDbContext);
CreateClients(configurationDbContext);
}
}
这可以毫无问题地创建我的数据库以及IdentityServer4所需的表/数据。
我现在正在阅读使用AspNet.Identity实现的IdentityServer文档,但它显示的是MVC而不是Api,我想继续按照以前的方式进行操作。
所以我将我的DbContext更新为此
public class DatabaseContext : IdentityDbContext<User>
{
// ReSharper disable once SuggestBaseTypeForParameter
public DatabaseContext(DbContextOptions<DatabaseContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);
}
}
我的用户类对此:
public class User : IdentityUser
{
}
我的创业公司现在有这个:
services.Configure<Config>(Configuration.GetSection("ConnectionStrings"));
var buildServiceProvider = services.BuildServiceProvider();
var config = buildServiceProvider.GetService<IOptions<Config>>();
services.AddDbContext<DatabaseContext>(options => options.UseSqlServer(config.Value.ConnectionString));
services.AddIdentity<User, IdentityRole>().AddEntityFrameworkStores<DatabaseContext>()
.AddDefaultTokenProviders();
我试图将我的种子方法更新为:
public static void SeedIdentityServerDatabase(this IApplicationBuilder app)
{
using (var scope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var serviceProvider = scope.ServiceProvider;
var persistedGrantDbContext = serviceProvider.GetRequiredService<PersistedGrantDbContext>();
var configurationDbContext = serviceProvider.GetRequiredService<ConfigurationDbContext>();
var databaseContext = serviceProvider.GetRequiredService<DatabaseContext>();
persistedGrantDbContext.Database.Migrate();
configurationDbContext.Database.Migrate();
databaseContext.Database.Migrate();
CreateIdentityResources(configurationDbContext);
CreateApiResources(configurationDbContext);
CreateClients(configurationDbContext);
CreateUsers(serviceProvider);
}
}
private static void CreateUsers(IServiceProvider provider)
{
const string email = "test.test@test.com";
var userManager = provider.GetRequiredService<UserManager<User>>();
var administrator = userManager.FindByEmailAsync(email).Result;
if (administrator != null) return;
administrator = new User {UserName = email, Email = email, EmailConfirmed = true};
var result = userManager.CreateAsync(administrator, "password").Result;
if (!result.Succeeded)
throw new Exception(result.Errors.First().Description);
result = userManager.AddClaimsAsync(administrator, new[]
{
new Claim(JwtClaimTypes.Name, "Test Test"),
new Claim(JwtClaimTypes.GivenName, "Test"),
new Claim(JwtClaimTypes.FamilyName, "Test"),
new Claim(JwtClaimTypes.Email, email),
new Claim(JwtClaimTypes.EmailVerified, "true", ClaimValueTypes.Boolean)
}).Result;
if (!result.Succeeded)
throw new Exception(result.Errors.First().Description);
}
当它到达该CreateUsers
方法时,它无法说明:
SqlException:对象名称“AspNetUsers”无效。
以下是它创建的表:
有谁知道我做错了什么?
解决方案
很难说没有看到您的CreateUsers
方法的代码,但默认情况下,许多UserManager
/SignInManager
方法似乎AspNetUsers
默认查找表(除非您指定不同的表名)。要继续使用默认值,您可以将其添加到类的OnModelCreating
方法中DatabaseContext
:
builder.Entity<User>(b => b.ToTable("AspNetUsers"));
否则,您的Migrate
命令可能会创建一个UserManager
/SignInManager
不知道的“用户”表。如果您希望将该表称为“用户”,那很好,只需将上面的内容更改为:
builder.Entity<User>(b => b.ToTable("Users"));
这样,UserManager
/SignInManager
将知道要为User
实体使用哪个表。
推荐阅读
- spring-cloud-netflix - How to use Service Discovery with Spring-Cloud-Config
- django - Windows 10//电子商务上的 Saleor Django SQL 错误
- javascript - CSS calc 中的数学是否比 JS 中的数学快?
- maven - 如何根据环境 pom.xml 有条件地选择特定目录
- java - 地图列表:Camel Sql 类型参考
- java - Minecraft Forge Modding:从 Eclipse 启动 Minecraft 不起作用
- javascript - 将 c# 时间戳转换为 javascript 时间戳
- excel - 输入数字时 Excel 单元格值更改为 TRUE
- scala - Spark 2.2 中的 Spark 程序比 Spark 1.6 慢两倍
- swift - XCConfig 文件可以为 Swift 代码定义布尔标志吗?