DbSet设为required时,如何用InMemoryDatabase进行测试
解决方案
问题核心是required修饰符强制要求属性在对象初始化阶段完成赋值,但EF Core原本会在上下文初始化后自动为DbSet创建代理实例,现在被required规则限制。要解决这个问题,无需手动创建DbSet实例,直接在上下文构造函数中利用EF Core内置的Set<T>()方法赋值即可:
修改你的TestContext类,在构造函数中为Users属性赋值:
public class TestContext : DbContext { public virtual required DbSet<User> Users { get; set; } public TestContext(DbContextOptions<TestContext> options) : base(options) { // 用EF Core的Set<T>()初始化,既满足required要求,又让EF管理DbSet实例 Users = Set<User>(); } }
修改后,测试类的代码无需改动,直接实例化上下文即可:
public class UserTests { public UserTests() { var options = new DbContextOptionsBuilder<TestContext>() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .Options; TestContext testContext = new TestContext(options); } }
原理是DbContext.Set<T>()会返回当前上下文关联的DbSet<T>实例,EF Core会自动完成实例的创建与管理,适配InMemory及其他数据库场景,完美匹配你的需求:保留required修饰符、无需模拟框架、不用手动实现DbSet抽象类。
内容的提问来源于stack exchange,提问作者hawthorne
相关产品推荐
相关产品推荐

