EF Core 2.0.1使用IdentityUser作导航属性时注册/迁移报错求助
嘿,这个坑我在EF Core 2.x里踩过好几次!咱们先拆解一下这个错误的核心:EF Core检测到你同时把基类IdentityUser和派生类ApplicationUser都纳入了数据模型,但主键只能在根实体(也就是IdentityUser)上配置,而且派生类会自动继承基类的主键,你要是在ApplicationUser上再配主键或者不小心把基类也加进模型,就会触发这个报错。
下面是一步步的解决办法:
检查DbContext的DbSet配置:确保你的DbContext里只声明
DbSet<ApplicationUser>(或者继承IdentityDbContext<ApplicationUser>的话,其实已经默认包含了,不用额外加),绝对不能有DbSet<IdentityUser>,否则EF会把基类也当成独立实体处理。
正确的DbContext示例:public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } // 这里只加你的业务实体DbSet,比如: public DbSet<Post> Posts { get; set; } }移除派生类上的主键配置:如果你在Fluent API里写了
modelBuilder.Entity<ApplicationUser>().HasKey(u => u.Id);,赶紧删掉!IdentityUser已经自带主键配置了,派生类继承即可,重复配置会冲突。替换所有导航属性的类型:如果你的其他实体里有用
IdentityUser作为导航属性的,全部改成ApplicationUser。比如:// 错误写法 public class Post { public IdentityUser Author { get; set; } } // 正确写法 public class Post { public int Id { get; set; } public string Content { get; set; } public ApplicationUser Author { get; set; } public string AuthorId { get; set; } // 外键字段 }重置迁移(如果已经生成过错误迁移):
- 删除项目里的
Migrations文件夹 - 打开包管理器控制台,执行
Add-Migration InitialCreate(或者你自定义的迁移名称) - 再执行
Update-Database完成数据库更新
- 删除项目里的
这样操作之后,EF Core就只会把ApplicationUser作为用户实体处理,继承IdentityUser的所有配置,不会再出现主键冲突的问题了。
内容的提问来源于stack exchange,提问作者rory

