如何在Repository仓储类中正确注入并使用自定义DBContext
问题解决步骤
1. 修正MovieRepository的错误
你当前的仓储类存在3处问题:
- 上下文类型笔误:你定义的上下文类是
MovieContext,但仓储里写的是MusicContext - 没有构造函数接收注入的上下文实例,导致
_db字段未赋值 - 访问DbSet的名称错误:你在
MovieContext中定义的DbSet是Movies,但仓储里写的是_db.Movie
修改后的仓储类代码如下:
public interface IMovieRepository { Movie GetMovieById(long id); IEnumerable<Movie> GetMovies(); } public class MovieRepository : IMovieRepository { private readonly MovieContext _db; // 新增构造函数,接收DI容器注入的MovieContext实例 public MovieRepository(MovieContext db) { _db = db; } public Movie GetMovieById(long id) { // 修正DbSet名称为Movies return _db.Movies.Find(id); } // 补充GetMovies方法的实现 public IEnumerable<Movie> GetMovies() { return _db.Movies.ToList(); } }
2. 补充MovieService的方法实现
你当前只定义了服务的注入逻辑,没有实现接口的方法,补充代码如下:
public class MovieService : IMovieService { IMovieRepository _movieRepository; public MovieService(IMovieRepository movieRepository) { _movieRepository = movieRepository; } public Movie RetrieveMovie(long id) { return _movieRepository.GetMovieById(id); } public IEnumerable<Movie> RetrieveMovies() { return _movieRepository.GetMovies(); } }
3. 在Startup中注册服务和仓储的依赖映射
你当前只注册了MovieContext,没有注册IMovieService和IMovieRepository的依赖关系,DI容器无法自动实例化这两个类型,需要在ConfigureServices方法中补充注册代码:
public void ConfigureServices(IServiceCollection services) { services.AddDbContext<MovieContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MovieContext"))); // 新增依赖注册 services.AddScoped<IMovieRepository, MovieRepository>(); services.AddScoped<IMovieService, MovieService>(); services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Movie.Api", Version = "v1" }); }); }
4. 确认配置项
确保你的appsettings.json中已经配置了名称为MovieContext的数据库连接字符串,且Movie实体类的字段和数据库表结构匹配。
内容的提问来源于stack exchange,提问作者MrEmper
相关产品推荐
相关产品推荐

