IdentityServer4 Sample with ASP Identity with real SQL Serve



我一直在努力让最终的SAMPLE(ASP.Net,EF Core,SQL(与真正的SQL Server一起工作。 我能找到的每个示例都没有使用真正的SQL,他们总是选择内存数据存储

我更改了连接字符串

"Data Source=.;Initial Catalog=IS4;Integrated Security=True;"

然后跑了

dotnet ef database update -c ApplicationDbContext

这为我创建了一个包含 25 个表的 SQL 数据库。

我调整了启动.cs以更改

services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));

和 b.UseSqlite to b.UseSqlServer

.AddConfigurationStore(options =>
{
options.ConfigureDbContext = b =>
b.UseSqlServer(connectionString,
sql => sql.MigrationsAssembly(migrationsAssembly));
})
// this adds the operational data from DB (codes, tokens, consents)
.AddOperationalStore(options =>
{
options.ConfigureDbContext = b =>
b.UseSqlServer(connectionString,
sql => sql.MigrationsAssembly(migrationsAssembly));
// this enables automatic token cleanup. this is optional.
options.EnableTokenCleanup = true;
// options.TokenCleanupInterval = 15;
});

我在命令行上使用"/seed"运行服务器,但种子功能不起作用

首先,它抱怨客户端在调用 SaveChanges(( 时不能有一个空 ID。如果我更改代码以添加 ID

if (!context.Clients.Any())
{
Console.WriteLine("Clients being populated");
int i = 1;
foreach (var client in Config.GetClients().ToList())
{
var x = client.ToEntity();
x.Id = i++;
context.Clients.Add(x);
}
context.SaveChanges();
}
else
{
Console.WriteLine("Clients already populated");
}

然后我得到

"Cannot insert the value NULL into column 'Id', table 'IS4.dbo.ClientGrantTypes".

当我观看视频时,它说只需更改连接字符串即可将其从SQLite迁移到完整的SQL,鉴于我所做的所有其他更改,这显然是不正确的,所以我必须做(或丢失(其他事情。

有什么想法吗?

难道所有带有"Id INT"列的表都应该是 IDENTITY 列,而它们不是!

我检查了迁移代码,它有

protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "ApiResources",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
Description = table.Column<string>(maxLength: 1000, nullable: true),
DisplayName = table.Column<string>(maxLength: 200, nullable: true),

我在猜测

.Annotation("Sqlite:Autoincrement", true),

不适用于完整的 SQL,因此所有表都需要标识属性设置。

有趣的是,如果您运行其他模板来添加管理UI

dotnet new is4admin

它似乎添加了几个SQL脚本

CREATE TABLE "Clients" (
"Id" INTEGER NOT NULL CONSTRAINT "PK_Clients" PRIMARY KEY AUTOINCREMENT,
"AbsoluteRefreshTokenLifetime" INTEGER NOT NULL,
"AccessTokenLifetime" INTEGER NOT NULL,

这确实使它们成为标识列。

我今天遇到了这个问题,在网上做了几次搜索,偶然发现了这个 https://entityframeworkcore.com/knowledge-base/46587067/ef-core---do-sqlserver-migrations-apply-to-sqlite-

指出的链接用于在迁移类UP方法之后切换注释部分

ID = 表。列(可为空:假(

.Annotation("Sqlite:Autoincrement", true);

.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)

您将需要导入

使用 Microsoft.EntityFrameworkCore.Metadata;

然后你构建,迁移将成功。

为了解决这个特定问题,我使用了SSMS。

  1. 右键单击表格
  2. 选择要删除和创建的脚本
  3. 在 NOT NULL 之后添加标识
  4. 执行

不管你说得对,它在sql文件和迁移中使用sqlite注释。

要完全解决此问题,您需要创建所有 3 个必需数据库上下文的实现:标识、持久授权和配置。

这还需要为每个上下文实现设计时工厂。

然后,您可以在包管理器控制台中为每个上下文运行 add-migration,然后运行更新数据库,或者在种子设定时使用迁移功能运行应用程序。

所以回顾一下:

  1. 为 3 db 上下文创建实现
  2. 为这些数据库上下文创建设计时工厂实现
  3. 添加迁移
  4. 使用这些迁移更新数据库

相关内容

  • 没有找到相关文章

最新更新