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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:32:32