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创建了一个新项目
  • 我没有为新创建的项目构建新的身份
  • 我从以前的项目中复制了db名称,并运行命令update database
  • 缺少两个表
    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)作为一个列规范。因此,我要更正的具体步骤是:

      • 删除Microsoft.EntityFrameworkCore.Sqlite Nuget包
      • 安装Microsoft.EntityFrameworkCore.SqlServer Nuget软件包
      • 在my Startup.cs的ConfigureServices方法中,将
        服务.AddDbContext
        调用更改为使用
        选项。使用SQLServer
        而不是
        选项。使用SQLite
      • 从Migrations文件夹中删除_CreateIdentitySchema和ApplicationDbContentsModelSnapshot类
      • 确保AppSettings.json中的连接字符串指向SQL Server而不是Sqlite后,运行
        dotnet ef migrations add CreateIdentitySchema-o Data\migrations
        。请注意,
        -o
        参数中指定的输出文件夹可能与您不同
      • 检查Visual Studio项目资源管理器。两个新类现在应该出现在迁移文件夹中
      • 运行
        dotnet ef database update
        。这将在连接字符串中记录的数据库中创建表
      • 此外,如果希望表位于特定架构中,例如“Auth”,请打开ApplicationDbContext类并添加:

        模型创建时受保护的覆盖无效(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.