如何将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
相关产品推荐
相关产品推荐

