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

如何将getDBContext返回的上下文设置给派生的DbContext类?

如何将外部获取的DbContext设置为自定义DbContext类自身的上下文?

我有一个派生自DbContext的类,代码如下:

public class ATPublicRestContext : DbContext {
    public ATPublicRestContext dbcontext;
    public ATPublicRestContext() {
        dbcontext = getDBContext();
    }
    public DbContext getDBContext() {
        ATPublicClient client = new ATPublicClient();
        //从服务总线获取上下文
        DbContext context = client.DBContext().context;
        return context;
    }
}

我的问题是:如何将getDBContext方法返回的上下文设置为ATPublicRestContext自身的上下文?


首先得指出,你现在的写法其实是让ATPublicRestContext额外持有了一个独立的DbContext实例,但这和你继承DbContext的初衷矛盾——你应该让ATPublicRestContext本身成为那个从服务总线获取的上下文,而不是包装它。下面分两种场景给你解决方案:

场景1:服务总线返回的上下文本身就是ATPublicRestContext类型

如果client.DBContext().context实际返回的就是ATPublicRestContext实例,那你可以直接复用它的配置来初始化当前类:

public class ATPublicRestContext : DbContext {
    // 不需要额外的dbcontext字段
    public ATPublicRestContext() : base(GetExternalContextOptions()) {
        // 基类构造函数会用外部上下文的配置初始化当前实例
    }

    private static DbContextOptions GetExternalContextOptions() {
        ATPublicClient client = new ATPublicClient();
        var externalContext = (ATPublicRestContext)client.DBContext().context;
        // 提取外部上下文的配置选项
        return externalContext.Database.GetDbContextOptions();
    }

    // 在这里定义你的实体集合,比如:
    // public DbSet<User> Users { get; set; }
}

场景2:服务总线返回的是通用DbContext实例

如果外部上下文是通用的DbContext,你需要提取它的核心配置(比如连接字符串),再传递给当前类的构造函数:

public class ATPublicRestContext : DbContext {
    public ATPublicRestContext() : base(BuildDbContextOptions()) { }

    private static DbContextOptions<ATPublicRestContext> BuildDbContextOptions() {
        ATPublicClient client = new ATPublicClient();
        DbContext externalContext = client.DBContext().context;
        
        // 提取外部上下文的连接字符串
        var connectionString = externalContext.Database.GetConnectionString();
        
        // 根据你的数据库类型构建配置(这里以SQL Server为例)
        return new DbContextOptionsBuilder<ATPublicRestContext>()
            .UseSqlServer(connectionString)
            .Options;
    }

    // 定义你的实体集合
    // public DbSet<Order> Orders { get; set; }
}

为什么原有写法不生效?

你原来的代码里,ATPublicRestContext本身是一个DbContext实例,同时又持有另一个dbcontext字段,相当于存在两个独立的上下文对象——它们的状态、连接完全不共享,根本达不到“将外部上下文设置为自身上下文”的目的。

内容的提问来源于stack exchange,提问作者J.Cart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:44:45