在迷你博客中为Post表添加AspNetUsers外键的实现步骤咨询
实现AspNetUsers ID作为Post表外键的步骤
嘿,我来帮你一步步搞定这个需求,整个流程很清晰,咱们分四步走:
1. 完善Post模型,添加外键字段
你的Post模型目前只有导航属性User,但缺少对应的外键字段。因为AspNetUsers默认的主键是string类型(Identity框架默认配置),所以咱们要显式添加外键属性,同时用数据注解指定关联关系:
public class Post { [Required] public int Id { get; set; } [Required] public string Title { get; set; } [Required] public string Content { get; set; } [Required] public string Path { get; set; } [Required] public DateTime PostDate { get; set; } // 添加外键字段,对应AspNetUsers的Id [Required] public string UserId { get; set; } // 配置外键关联,指定UserId对应User导航属性 [ForeignKey(nameof(UserId))] public ApplicationUser User { get; set; } // 你的其他属性... public IEnumerable<...>... }
另外,建议在ApplicationUser模型里也添加对应的导航属性,方便后续从用户查询他的所有文章:
public class ApplicationUser : IdentityUser { // 添加这行 public ICollection<Post> Posts { get; set; } = new List<Post>(); // 你的其他自定义属性... }
2. 可选:用Fluent API显式配置实体关系(推荐)
如果你偏好Fluent API而不是数据注解,可以在你的DbContext的OnModelCreating方法里添加这段配置,确保EF Core正确识别关联关系:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 别漏了这行,Identity的配置要保留 // 配置Post和ApplicationUser的一对多关系 modelBuilder.Entity<Post>() .HasOne(p => p.User) .WithMany(u => u.Posts) .HasForeignKey(p => p.UserId) .OnDelete(DeleteBehavior.Cascade); // 可选:设置删除用户时的级联行为,比如删除用户同时删除他的文章 }
3. 创建文章时赋值当前用户ID
在你的PostsController的Create方法里,先获取当前登录用户的ID,然后赋值给Post的UserId字段。记得给Create方法加上[Authorize]注解,确保只有登录用户才能创建文章:
[Authorize] public class PostsController : Controller { private readonly YourDbContext _context; public PostsController(YourDbContext context) { _context = context; } // GET: Posts/Create public IActionResult Create() { return View(); } // POST: Posts/Create [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create([Bind("Title,Content,Path")] Post post) { if (ModelState.IsValid) { // 获取当前登录用户的ID var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); post.UserId = userId; post.PostDate = DateTime.UtcNow; // 建议用UTC时间,避免时区问题 _context.Add(post); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } return View(post); } }
4. 生成并执行数据库迁移
最后一步是把模型的变更同步到数据库:
- 打开Package Manager Console(PMC),运行:
Add-Migration AddUserIdForeignKeyToPost - 然后执行迁移,更新数据库:
Update-Database
如果用.NET CLI的话,对应的命令是:
dotnet ef migrations add AddUserIdForeignKeyToPost dotnet ef database update
这样一来,用户创建文章时,当前登录用户的ID就会作为外键插入到Post表中啦!
内容的提问来源于stack exchange,提问作者user9077365
相关产品推荐
相关产品推荐

