当前位置: 首页 > 知识库问答 >
问题:

为同一模型创建两个EF上下文

秦楚
2023-03-14

我有一个app和两个MySQL数据库交互,其中一个是副本。当我需要执行事务时,我使用主数据库,当我需要访问一些历史数据或执行一些成本更高的选择时,我使用从数据库。

我尝试了以下操作:

public class MyDbContext : IdentityDbContext<ApplicationUser>
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }

    public DbSet<Order> Orders { get; set; }
    public DbSet<Customer> Customers { get; set; }
    //...

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.EnableSensitiveDataLogging();
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        //...
    }
}

public class MyMainDbContext : MyDbContext
{
    public MyMainDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }
}

public class MyReplicationDbContext : MyDbContext
{
    public MyReplicationDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }
}

startup.cs中,我配置了以下服务:

public void ConfigureServices(IServiceCollection services)
{
        services.AddDbContext<MyMainDbContext>(options =>
            options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));

        services.AddDbContext<MyReplicationDbContext>(options =>
            options.UseMySql(Configuration.GetConnectionString("ReplicationConnection")));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<MyMainDbContext>()
            .AddDefaultTokenProviders();

        services.Configure<IdentityOptions>(options =>
        {
            // Password settings
        });
        //...
}

我将使用这两个上下文,如下所示:

public class StockController : Controller
{
    private readonly MyMainDbContext _context;

    public StockController(MyMainDbContext context)
    {
        _context = context;
    }
    
    public async Task<IActionResult> Index()
    {
        //I only need MyMainDbContext here
    }
    
    public async Task<IActionResult> LastMonthsAverageStock([FromServices] MyReplicationDbContext replicationContext)
    {
        //I need MyReplicationDbContext here, it's an expensive query and fresh data is not important
    }
}

我遇到以下异常:

InvalidOperationException:尝试激活“StockApp.DataModels.MyMainDbContext”时,无法解析类型“Microsoft.EntityFrameworkCore.DBContextToptions”1[StockApp.DataModels.MyDbContext]“的服务。

我的问题是:这是正确的做法吗?我错过了什么?

共有1个答案

闾丘淇
2023-03-14

这个

public class MyMainDbContext : MyDbContext
{
    public MyMainDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }
}

应该是

public class MyMainDbContext : MyDbContext
{
    public MyMainDbContext(DbContextOptions<MyMainDbContext> options) : base(options)
    {
    }
}
 类似资料:
  • 我知道我可以这样用一个根上下文写两个dispatchers servlet: @override public void onStartup(ServletContext ServletContext)抛出ServletException{ } 但是我如何使用AbstractAnnotationConfigDispatcherServletInitializer来实现这一点呢?如果不可能--为什么

  • 我使用一个Android库,它要求我创建两个类,每个类继承自不同的类 (具有公共基类) 现在我有这个代码: 我必须复制这个类来创建一个扩展,即使我的两个类共享完全相同的代码。 我简化了示例的代码,但重复可能很重要 我决定将代码放在这两个类之外的静态方法中,并在类重写的方法中调用它们,但我认为必须有一种更干净的方法来做到这一点。 你能帮我解决这个问题吗? 和都继承自。

  • 本文向大家介绍Django 创建您的第一个模型,包括了Django 创建您的第一个模型的使用技巧和注意事项,需要的朋友参考一下 示例 通常在models.py应用程序子目录下的文件中定义模型。在Model类的django.db.models模块是一个很好的起点类来扩展你的模型。例如: 模型中的每个属性代表数据库中的一列。 title 是最大长度为100个字符的文本 author是ForeignKe

  • 问题内容: 我想要两个相同模型的外键: 我收到如下错误: 字段“ example1”的访问器与相关字段“ Example.test_set”冲突。在“ example1”的定义中添加一个related_name参数。 问题答案: 尝试使用:

  • 我有一个场景,其中一个url“serachUser”可能带有两个不同的值(请求参数)userId或UserName。 为此我创造了两种方法 但我得到模糊映射发现异常。Spring能处理这种情况吗?

  • 我正在尝试构建一个CI流程,使用Travis CI从github自动将发布工件上传到Maven Central(Sonatype)。基本上,一切都很好,除了在最后;我从maven deploy命令中获得了两个不同的Nexus存储库:一个用于pom和jar;第二个是源代码、javadoc和签名。 我的猜测是,由于中间的元数据上传,他创建了两个存储库: 还我不明白为什么,以及如何修复它。 我的pom。