kle*_*ent 13 sql-server asp.net-core
我刚刚使用命令dotnet new angular -o <output_directory_name> -au Individual和脚手架标识创建了项目,然后我安装了 Microsoft.EntityFrameworkCore.SqlServer 但是当我运行命令 update-database 时,我收到以下错误。
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])
);
Run Code Online (Sandbox Code Playgroud)
然后在最后结束另一个错误
错误编号: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);
});
Run Code Online (Sandbox Code Playgroud)
ApplicationDbContextModelSnapshot.cs
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");
});
Run Code Online (Sandbox Code Playgroud)
如何修复此错误以便我可以更新数据库?
将00000000000000_CreateIdentitySchema.Designer.cs中的'TEXT' 更改为 'VARCHAR'导致以下错误。当我将其更改为“NVARCHAR”时也会发生同样的情况
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.
Run Code Online (Sandbox Code Playgroud)
小智 14
我有这个错误,可以按如下方式修复。
打开项目并删除 2 个迁移文件和 1 个快照文件。最有可能命名为 0000...InitialCreate.cs、0000...InitialCreate.Designer.cs 和 ...DbContextModelSnapshot.cs。离开 DbContextClass。
删除数据库。
使用 dotnet 创建新的迁移并更新数据库。我还编写了迁移脚本来检查它。
dotnet ef migrations add InitialCreate --context ApplicationDbContext -v
dotnet ef database update --context ApplicationDbContext -v
dotnet ef migrations script --context ApplicationDbContext -v
这些答案都很有帮助,尤其是来自@klent 的答案。我使用以下方法生成了一个新项目:
dotnet new angular -o [我的项目] -au 个人
这产生了一个使用 Sqlite 作为数据提供者的新项目,尽管我不知道这一点。我将连接字符串更改为我的 SQL Server,然后运行:
dotnet ef 数据库更新
并在原始问题中发布了错误。在查看这里的答案后,我意识到我的数据提供程序不正确,并且迁移针对的是 Sqlite 语法,该语法使用 TEXT(256) 作为列规范之一。所以我纠正的具体步骤是:
services.AddDbContext调用更改为 useoptions.UseSqlServer而不是options.UseSqlite.dotnet ef migrations add CreateIdentitySchema -o Data\Migrations. 请注意,-o参数中指定的输出文件夹可能与您不同。dotnet ef database update。这将在连接字符串中注明的数据库中创建表。此外,如果您希望您的表位于特定模式中,例如“Auth”,请打开您的 ApplicationDbContext 类并添加:
protected override void OnModelCreating( ModelBuilder builder )
{
base.OnModelCreating( builder );
builder.HasDefaultSchema( "Auth" );
}
Run Code Online (Sandbox Code Playgroud)
但是,这将为使用此 DbContext 的所有访问设置架构。这对我来说不是问题,因为我没有将 EF 用于我的应用程序数据,只是身份数据。天啊。
根据 @sepupic 和 @PeterSmith 的评论,问题是自动生成的代码中00000000000000_CreateIdentitySchema.Designer.cs有TEXT字段HasMaxLength,所以我将其更改为VARCHAR然后添加HasMaxLength(450)到所有VARCHARId,然后我再次尝试更新数据库并且它起作用了。
我运行该项目并尝试注册用户,但收到以下错误
System.InvalidCastException:无法将类型“System.Int32”的对象强制转换为类型“System.Bolean”
由于我仍然有错误,所以我执行了以下操作:
dotnet new angular -o <output_directory_name> -au IndividualDeviceCodes,PersistedGrants所以我运行了该命令add-migration,但它没有生成任何内容,因此我从之前的项目中复制了两个表的迁移代码,并将其粘贴到我之前创建的空迁移代码中。我仍然不知道为什么会出现错误,因为我之前做的项目自动生成的代码没有任何问题。
| 归档时间: |
|
| 查看次数: |
5388 次 |
| 最近记录: |