asp.net – 如何在EF Core中向Identity用户添加外键?
假设我在EF生成的数据库中具有带有相应Todo表(DbSet< Todo>)的Todo模型.该表将每行存储待办事项.每个用户(在ASP.NET核心身份IdentityServer应用程序中)将与多个待办事项关联(一对多,用户可以有多个待办事项).
我这样做的方法是向Todo模型添加一个UserId外键,代表拥有待办事项的用户. 在使用ASP.NET核心标识证明的类时,如何使用EF Core?我的直觉是将以下内容添加到Todo类模型中: public string UserId { get; set; } [ForeignKey("UserId")] public ApplicationUser User { get; set; } 这使用ApplicationUser(ASP.NET核心标识默认用户类模型)作为发现来使用外键填充UserId. 这是问题所在:当我运行Update-Database时出现错误!它表示实体类型’IdentityUserLogin< string>‘需要定义主键.. 浏览IdentityUserLogin的代码,我可以看到它有一个属性UserId应该被认为是主键,对吧? 无论如何,为了确保将其注册为主键,我将此代码添加到ApplicationUser的OnModelCreating方法:builder.Entity< ApplicationUser>().HasKey(u => u.Id);.我仍然得到同样的错误!不知道我在这里做错了什么:(.编辑:是的,我打电话给基类,这不是问题所在. 注意:我知道我可以为每个携带todo项目ID集合的用户添加一个字段,而不是使用外键,但我不确定这是否是这样做的好方法.对此问题的指导表示赞赏. 解决方法
你没有为此共享代码,但我猜你已经在db上下文中重写了OnModelCreating,但是没有调用base.OnModelCreating(modelBuilder);.
如果没有基本调用,则您的上下文不会应用与身份相关的架构. protected override void OnModelCreating(ModelBuilder modelBuilder) { // Add Identity related model configuration base.OnModelCreating(modelBuilder); // Your fluent modeling here } 编辑:感觉就像给这个旋转所以我只是执行了以下任务. TLDR将是它为我解决的问题.我相信你所遇到的问题与你正在制作的密钥无关,而与你无关的东西会导致你的失败,因为你所获得的失败与你正在构建模式的表完全不同. 我使用Identity创建了一个新的.net核心Web应用程序.我做的第一件事是调用update-database来从项目附带的初始迁移中构建数据库.这很有效. 接下来我添加了一个Todo课程.没有属性,只有Id和用户字段.甚至没有标记外键. public class Todo { public int Id { get; set; } public string UserId { get; set; } public ApplicationUser User { get; set; } } 我将它作为DbSet添加到ApplicationDbContext中.只更改上下文是添加ToDo DbSet 然后我在包管理器控制台中调用了add-migration todo来构建todo迁移.它与FK一起按预期生成. public partial class Todo : Migration { protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( name: "Todos",columns: table => new { Id = table.Column<int>(nullable: false) .Annotation("SqlServer:ValueGenerationStrategy",SqlServerValueGenerationStrategy.IdentityColumn),UserId = table.Column<string>(nullable: true) },constraints: table => { table.PrimaryKey("PK_Todos",x => x.Id); table.ForeignKey( name: "FK_Todos_AspNetUsers_UserId",column: x => x.UserId,principalTable: "AspNetUsers",principalColumn: "Id",onDelete: ReferentialAction.Restrict); }); migrationBuilder.CreateIndex( name: "IX_Todos_UserId",table: "Todos",column: "UserId"); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( name: "Todos"); } } 然后我向我的About控制器操作添加了一些代码,只是将记录粘贴到表中以确保FK正常工作.它是. public async Task<IActionResult> About() { var user = await _userManager.GetUserAsync(HttpContext.User); var todo = new Todo { User = user }; _context.Todos.Add(todo); await _context.SaveChangesAsync(); return View(); } 数据库中记录的屏幕截图以及表和键: 除了显而易见的是你的Todo课程中有更多的字段,你有不同的东西,你做了不同的事情,可能会导致我们的问题? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |