Sql server ASP.NET核心3.0-Can';更新数据库
我刚刚使用命令Sql server ASP.NET核心3.0-Can';更新数据库,sql-server,asp.net-core,Sql Server,Asp.net Core,我刚刚使用命令dotnet new angular-o-au Individual和scaffold identity创建了该项目,然后安装了Microsoft.EntityFrameworkCore.SqlServer,但当我运行命令更新数据库时,我发现以下错误 Failed executing DbCommand (4ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] CREATE TABLE [AspNetRoles]
dotnet new angular-o-au Individual
和scaffold identity创建了该项目,然后安装了Microsoft.EntityFrameworkCore.SqlServer,但当我运行命令更新数据库时,我发现以下错误
Failed executing DbCommand (4ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [AspNetRoles] (
[Id] TEXT NOT NULL,
[Name] TEXT(256) NULL,
[NormalizedName] TEXT(256) NULL,
[ConcurrencyStamp] TEXT NULL,
CONSTRAINT [PK_AspNetRoles] PRIMARY KEY ([Id])
);
最后又出现了一个错误
错误编号:2716,状态:1,类别:16列、参数或变量#2:无法在数据类型文本上指定列宽 下面是生成的
CreateIdentitySchema
迁移
migrationBuilder.CreateTable(
name: "AspNetRoles",
columns: table => new
{
Id = table.Column<string>(nullable: false),
Name = table.Column<string>(maxLength: 256, nullable: true),
NormalizedName = table.Column<string>(maxLength: 256, nullable: true),
ConcurrencyStamp = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_AspNetRoles", x => x.Id);
});
根据@sepupic和@PeterSmith的评论,问题是
00000000000000\u CreateIdentitySchema.Designer.cs
中自动生成的代码有TEXT
字段和HasMaxLength
,因此我将其更改为VARCHAR
,然后添加了HasMaxLength(450)
到所有VARCHAR
Ids,然后我尝试再次更新数据库,结果成功了
我运行该项目并试图注册一个用户,但我得到了下面的错误
System.InvalidCastException:无法将“System.Int32”类型的对象强制转换为“System.Bolean”类型
由于我仍然有错误,我做了以下工作:
dotnet new angular-o-au Individual创建了一个新项目
DeviceCodes
和PersistedGrants
,因此我运行命令add migration
,但它没有生成任何内容,因此我从以前的项目中复制了两个表的迁移代码,并将其粘贴到我先前创建的空迁移代码中李>
我仍然不知道为什么会出错,因为我以前做的项目在自动生成的代码方面没有任何问题。正如其他一些人已经回答的那样,默认标识安装似乎创建了错误的列类型;也就是说,一些Id列应该是varchar而不是text 我和你有完全相同的问题,花了很多时间试图有效地解决它 我找到的解决此问题的最快方法是:
- 创建新项目
- 完全删除迁移文件夹
- 安装Sql Server(或您正在使用的任何数据系统)包和连接字符串详细信息
- 使用
或dotnet ef migrations Add
添加您自己的迁移(这将使用正确的列结构从头开始编写新的迁移设计器文件)Add migration
- 最后,使用
或dotnet ef database update
update database
- 打开项目并删除2个迁移文件和1个快照文件。最可能的名称是0000…InitialCreate.cs、0000…InitialCreate.Designer.cs和…DbContextModelSnapshot.cs。保留DbContextClass
- 删除数据库
- 使用dotnet创建新迁移并更新数据库。我还编写了迁移脚本以检查迁移
- 我有这个错误,可以按如下方式修复
dotnet ef迁移添加InitialCreate--context ApplicationDbContext-v
dotnet ef数据库更新——上下文应用程序dbcontext-v
dotnet ef migrations script--context ApplicationDbContext-v
这些答案都很有帮助,尤其是@klent的答案。我使用以下方法生成了一个新项目:
dotnet新angular-o[我的项目]-au个人
这产生了一个新项目,该项目使用Sqlite作为数据提供程序,尽管我不知道。我将连接字符串更改为我的SQL Server,然后运行:
dotnet ef数据库更新
并在原始问题中发布了错误。在查看此处的答案后,我意识到我的数据提供程序不正确,迁移的目标是Sqlite语法,该语法使用文本(256)作为一个列规范。因此,我要更正的具体步骤是:
服务.AddDbContext
调用更改为使用选项。使用SQLServer
而不是选项。使用SQLite
dotnet ef migrations add CreateIdentitySchema-o Data\migrations
。请注意,-o
参数中指定的输出文件夹可能与您不同dotnet ef database update
。这将在连接字符串中记录的数据库中创建表模型创建时受保护的覆盖无效(ModelBuilder)
{
基于模型创建(生成器);
builder.hasdaultschema(“Auth”);
}
但是,这将为使用此DbContext的所有访问设置架构。这对我来说不是问题,因为我没有对我的应用程序数据使用EF,只是对Identity data.YMMV使用EF。我遇到了一个类似于您的错误 表“角色”中的列“Id”的类型无效,无法用作索引中的键列 因为我更改了Asp.Net核心web应用程序的各个标识附带的表名 简单地说,
-
<
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.HasColumnType("nvarchar(450)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasColumnType("nvarchar(max)");
b.Property<string>("Name")
.HasColumnType("nvarchar(256)")
.HasMaxLength(256);
b.Property<string>("NormalizedName")
.HasColumnType("nvarchar(256)")
.HasMaxLength(256);
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasName("RoleNameIndex")
.HasFilter("[NormalizedName] IS NOT NULL");
b.ToTable("AspNetRoles");
});
Data type 'VARCHAR' for property 'Id' is not supported in this form. Either specify the length explicitly in the type name, for example as 'NVARCHAR(16)', or remove the data type and use APIs such as HasMaxLength to allow EF choose the data type.