.NET Core + EF实现用户收藏电影API问题求助
解决方案:用户收藏电影功能实现步骤
1. 修正实体模型(关键:补全外键与规范导航属性)
你的Favourite中间表缺少明确的外键字段,EF Core无法自动识别用户与电影的关联关系,同时导航属性建议初始化避免空引用问题,修正后的代码如下:
public class User { [Key] public long Id { get; set; } // 规范命名:首字母大写 public string? Username { get; set; } public string? Email { get; set; } public string? Password { get; set; } public string? FirstName { get; set; } public string? LastName { get; set; } public string? Address { get; set;} // 初始化集合避免空引用,命名改为复数更规范 public ICollection<Favourite> Favourites { get; set; } = new List<Favourite>(); } public class Movie { [Key] public long Id { get; set; } public string? Title { get; set; } public string? Description { get; set; } public string? Gender { get; set; } public DateTime ReleaseDate { get; set; } [NotMapped] public IFormFile? CoverImage { get; set; } // 补充电影对应的收藏导航属性 public ICollection<Favourite> Favourites { get; set; } = new List<Favourite>(); } public class Favourite { [Key] public int Id { get; set; } // 添加外键字段,与User、Movie的主键类型匹配 public long UserId { get; set; } public long MovieId { get; set; } // 导航属性 public User User { get; set; } = null!; public Movie Movie { get; set; } = null!; }
2. 在DbContext中配置多对多关系
用EF Core的Fluent API明确配置中间表的关联,确保数据库生成正确的外键约束:
public class AppDbContext : DbContext { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } public DbSet<User> Users { get; set; } public DbSet<Movie> Movies { get; set; } public DbSet<Favourite> Favourites { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Favourite>() .HasOne(f => f.User) .WithMany(u => u.Favourites) .HasForeignKey(f => f.UserId) .OnDelete(DeleteBehavior.Cascade); // 用户删除时,收藏记录也删除 modelBuilder.Entity<Favourite>() .HasOne(f => f.Movie) .WithMany(m => m.Favourites) .HasForeignKey(f => f.MovieId) .OnDelete(DeleteBehavior.Cascade); // 电影删除时,收藏记录也删除 } }
3. 实现添加收藏的业务逻辑
以ASP.NET Core为例,在控制器中获取当前登录用户ID,完成收藏添加逻辑:
[Authorize] // 确保只有登录用户能访问 [HttpPost("add-favourite")] public async Task<IActionResult> AddFavourite(long movieId) { // 获取当前登录用户ID var userId = long.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!); // 检查是否已经收藏过该电影,避免重复添加 var existingFavourite = await _context.Favourites .FirstOrDefaultAsync(f => f.UserId == userId && f.MovieId == movieId); if (existingFavourite != null) { return BadRequest("该电影已在你的收藏列表中"); } var favourite = new Favourite { UserId = userId, MovieId = movieId }; _context.Favourites.Add(favourite); await _context.SaveChangesAsync(); return Ok("收藏成功"); }
4. 后续操作提示
如果之前已生成过数据库迁移,需要重新生成并更新数据库:
Add-Migration AddFavouriteForeignKeys Update-Database
内容的提问来源于stack exchange,提问作者Rezan
相关产品推荐
相关产品推荐

