簡體   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