如何从另一个类引用DB Context类?附Code First生成的Users类代码
如何从另一个类引用DB Context类
嘿,我来帮你搞定这个问题!首先得确认:你用Code First from Database逆向工程生成Users类的时候,应该同时生成了一个继承自DbContext的类(比如默认会叫BookingsContext或者和你的项目/数据库同名),它负责和数据库交互,里面会包含DbSet<Users> Users这样的属性,大概长这样:
namespace BookingsModel { public class BookingsContext : DbContext { public BookingsContext() : base("name=BookingsContext") { } public virtual DbSet<Users> Users { get; set; } // 其他实体对应的DbSet也会在这里 } }
接下来给你分享几种常用的引用方式,按需选择:
1. 直接实例化(快速简单,适合小项目)
如果是小型工具类或者快速验证功能,直接在目标类里创建Context实例就行,记得用using语句自动释放资源,避免内存泄漏:
using BookingsModel; // 先引入Context所在的命名空间 public class UserService { public Users GetUserById(int userId) { using (var context = new BookingsContext()) { return context.Users.Find(userId); } } }
2. 依赖注入(推荐中大型项目,优雅又好维护)
这是现在主流的方式,尤其是在ASP.NET Core这类框架里,原生支持,还方便做单元测试。分两步走:
第一步:把Context注册到服务容器
在启动类(比如ASP.NET Core的Program.cs)里添加注册代码,这里以SqlServer为例,你可以根据自己的数据库类型调整:
using BookingsModel; using Microsoft.EntityFrameworkCore; var builder = WebApplication.CreateBuilder(args); // 注册DbContext,读取配置文件里的连接字符串 builder.Services.AddDbContext<BookingsContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("BookingsContext")));
第二步:在目标类里通过构造函数注入
直接在类的构造函数里声明需要的Context,框架会自动帮你实例化并传入:
using BookingsModel; public class UserService { private readonly BookingsContext _context; // 构造函数注入Context public UserService(BookingsContext context) { _context = context; } public List<Users> GetAllUsers() { return _context.Users.ToList(); } }
3. 静态辅助类(不推荐,仅临时应急)
如果你暂时不想搞依赖注入,又想少写点重复代码,可以整个静态类封装Context,但要注意这种方式有线程安全问题,高并发场景别用:
using BookingsModel; public static class DbContextHelper { private static readonly BookingsContext _context = new BookingsContext(); public static BookingsContext GetContext() { return _context; } } // 其他类里这么用 public class UserManager { public void AddNewUser(Users newUser) { var context = DbContextHelper.GetContext(); context.Users.Add(newUser); context.SaveChanges(); } }
最后提几个注意点
- 确保连接字符串配置正确:ASP.NET Core看
appsettings.json,传统.NET Framework看App.config/Web.config。 - 能用依赖注入就尽量用,代码更灵活,也好测试。
- 直接实例化的时候一定要用
using,不然容易占着数据库连接不释放。
内容的提问来源于stack exchange,提问作者OverdueOrange
相关产品推荐
相关产品推荐

