繁体   English   中英

在具有相同基础 class 的 .net 内核中注册多个 DBContext

[英]Registering multiple DBContexts in .net core with same base class

所以只是好奇,我有一个应用程序,它有一个内部站点和一个外部站点。 他们的数据库是相同的。 基本上,内部应用程序是供用户更改显示在外部应用程序上的数据。 所以为此,我决定为内部数据库连接的应用程序创建一个单独的数据库上下文。 然后,我为外部连接创建了另一个从内部上下文继承的上下文,因为我认为我可以将它们添加到服务中并将每个上下文设置到它自己的数据库中。 当我将它们注入我的启动子 class 时,两个数据库连接都指向同一个数据库。 为什么是这样? 所以我的上下文是:

public class AppContext : DbContext
{
    public AppContext() { }

    public AppContext(DbContextOptions<AppContext> options): base(options)
    { }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Folder.Folder>().ToTable("Folders");

        modelBuilder.Entity<File.File>().ToTable("Files");

        modelBuilder.Entity<DocumentView>().ToTable("DocumentViews")
            .HasKey(c=> new { c.PersonId, c.DocId });

        modelBuilder.Entity<AppInfo>().ToTable("AppInfo");
    }

    public DbSet<Folder.Folder> Folders { get; set; }
    public DbSet<File.File> Files { get; set; }
    public DbSet<DocumentView> DocumentViews { get; set; }
    public DbSet<AppInfo> AppInfos { get; set; }
}

public class ExternalAppContext : AppContext
{
    public ExternalAppContext(DbContextOptions<AppContext> options) : base(options)
    { }
}

当我在我的创业公司注册它们时,我就这样注册了它们。

services.AddDbContext<AppContext>(options => options.UseSqlite(@"Data Source=" + Configuration["SqlConnection:adminDbLocation"]));
services.AddDbContext<ExternalAppContext>(options => options.UseSqlite(@"Data Source=" + Configuration["SqlConnection:externalDbLocation"]))

启动子 class 注入为:

public Promoter(ExternalAppContext externalContext, AppContext adminContext)
{
    _externalContext = externalContext;
    _adminContext = adminContext;
}

所以这里的真正答案嵌套在三年前的 github 答案中,可以在https://github.com/dotnet/efcore/issues/7533中找到。 问题归结为如何为池呈现服务,这就是为什么在注册多个 DbContext 时必须在 DbContextOptions 上指定类型的原因。 要在基础 class 上解决此问题,您可以为选项设置一个受保护的构造函数。 这将允许池正常工作并允许您继承上下文。 greggbjensen 在 2017 年 12 月给出的示例如下,正是我想要的。

public class MainDbContext : DbContext
{
    public MainDbContext(DbContextOptions<MainDbContext> options)
        : base(options)
    {
    }

    protected MainDbContext(DbContextOptions options)
        : base(options)
    {
    }
}

public class SubDbContext : MainDbContext
{
    public SubDbContext (DbContextOptions<SubDbContext> options)
        : base(options)
    {
    }
}

这允许在 .net 核心服务代码中设置两个服务。

services.AddDbContext<MainDbContext >(options => [[SomeOptionsHere]]);
services.AddDbContext<SubDbContext >(options => [[SomeOptionsHere]]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM