You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:47:34