我一直在努力让最终的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。
- 右键单击表格
- 选择要删除和创建的脚本
- 在 NOT NULL 之后添加标识
- 执行
不管你说得对,它在sql文件和迁移中使用sqlite注释。
要完全解决此问题,您需要创建所有 3 个必需数据库上下文的实现:标识、持久授权和配置。
这还需要为每个上下文实现设计时工厂。
然后,您可以在包管理器控制台中为每个上下文运行 add-migration,然后运行更新数据库,或者在种子设定时使用迁移功能运行应用程序。
所以回顾一下:
- 为 3 db 上下文创建实现
- 为这些数据库上下文创建设计时工厂实现
- 添加迁移
- 使用这些迁移更新数据库