AspNet Core数据库迁移报错:已存在AspNetRoles对象求助
解决ASP.NET Core Identity迁移时"AspNetRoles已存在"的问题
看起来你在创建新的ASP.NET Core WebAPI项目并集成IdentityDbContext后,执行EF Core迁移时遇到了数据库表重复创建的错误,核心问题是数据库里已经存在AspNetRoles表,但EF Core的迁移系统还尝试重新创建它。下面是问题分析和具体的解决方案:
问题重现
你在NuGet包管理器控制台执行了这些命令:
PM> Add-Migration Initial To undo this action, use Remove-Migration. PM> Update-Database
随后收到关键错误:
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'AspNetRoles' in the database.
问题原因分析
大概率是以下情况之一导致的:
- 你连接的数据库并非全新空库,之前被其他使用Identity的项目用过,或者手动创建过Identity相关表;
- 数据库中的
__EFMigrationsHistory表没有记录你的Initial迁移,但实际表已经存在,EF Core误判需要重新创建; - 项目的数据库连接字符串指向了一个已有数据的数据库,而非全新数据库。
具体解决方案
方案1:让EF Core认可现有数据库结构
如果数据库里的Identity表结构和你当前迁移生成的完全一致,可以让EF Core跳过建表步骤:
- 先移除已创建的迁移:
(如果有多个迁移,重复执行直到所有迁移都被移除)PM> Remove-Migration - 重新生成初始迁移:
PM> Add-Migration Initial - 将该迁移标记为已应用到数据库(不会执行实际建表SQL):
或者你可以直接在数据库中手动插入迁移记录(替换成你自己的PM> Update-Database -Migration 0 PM> Update-DatabaseMigrationId和ProductVersion,这两个值可在Migrations文件夹下的迁移文件顶部找到):INSERT INTO __EFMigrationsHistory (MigrationId, ProductVersion) VALUES ('20180516150423_Initial', '2.1.0-rtm-30799');
方案2:改用全新空数据库
修改appsettings.json中的数据库连接字符串,指向一个尚未创建的数据库(SQL Server会自动创建它),然后再次执行:
PM> Update-Database
这样EF Core就能在全新数据库中正常创建所有Identity所需的表。
方案3:清理现有数据库的旧表
如果数据库中的现有数据对你无用,可以手动删除所有AspNet前缀的表(如AspNetRoles、AspNetUsers、AspNetUserRoles等),同时删除__EFMigrationsHistory表,之后重新执行Update-Database命令。
额外检查点
- 确认你的DbContext继承正确:应该是
public class YourDbContext : IdentityDbContext<IdentityUser>(或者你自定义的用户类); - 检查Startup.cs中的Identity配置是否正确:
services.AddDbContext<YourDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddDefaultIdentity<IdentityUser>() .AddEntityFrameworkStores<YourDbContext>();
内容的提问来源于stack exchange,提问作者Nikita Goncharuk
相关产品推荐
相关产品推荐

