Как определить несколько EF DbContexts, которые имеют одинаковую структуру, чтобы они могли использовать методы взаимозаменяемо? - PullRequest
0 голосов
/ 23 апреля 2020

Я использую единый дизайн базы данных для 3 разных SQL серверов (производство, резервное копирование, мастер). Конструкция проста, как показано ниже для места производства:

Public Class ProductionDbContext
    Inherits DbContext

    Public Sub New()
        MyBase.New("ProductionDbConnection")
    End Sub

    Public Sub New(connectionString As String)
        MyBase.New(connectionString)
    End Sub

    Public Property Tables As DbSet(Of Table)     'Table includes a List(Of Topic)
    Public Property Topics As DbSet(Of Topic)     'for direct access to Topics when needed
End Class

Я изначально закодировал 3 отдельных контекста в соответствии с тем, что описано выше, поэтому:

Public Class ProductionDbContext
Public Class BackupDbContext
Public Class MasterDbContext

Когда я получаю доступ к этим контекстам для различные операции, я хотел бы сделать что-то простое, как:

Dim prodDb As New ProductionDbContext
Dim backupDb As New BackupDbContext
Dim masterDb As New MasterDbContext
Dim topicsList As New List(Of Topic)
LoadData(topicsList, prodDb)     or
LoadData(topicsList, backupDb)   or
LoadData(topicsList, masterDb)

А затем LoadData определяется как что-то вроде (но это не работает):

Public Sub LoadData(ByRef topicsList As List(Of Topic), localContext As Object)

  Dim thisTopicTable = localContext.Tables.Include("Topics").Where(Function(x) x.Property = "something").SingleOrDefault()
  If thisTopicTable IsNot Nothing Then
    topicsList = thisTopicTable.Topics.ToList()
  End If

End Sub

Это не не работает, потому что localContext не определен должным образом, чтобы иметь доступ к методам EF, таким как .Where и т. д.

Я знаю, что моя текущая попытка разработки неверна, но у меня пока нет опыта, чтобы знать как я должен был спроектировать вещи так, чтобы 3 разные базы данных / dbContexts могли рассматриваться как похожие объекты, и мне не нужно «повторяться» во всем коде.

Возможно, есть лучший способ настроить 3 отдельные базы данных, которые мне следовало бы использовать, и это было бы здорово узнать (подразумевается вопрос 1), но я все же хотел бы глубже понять, как я использую идею типа O bject при передаче параметров, чтобы объект мог быть закодирован в новом методе так же, как и объект, передаваемый в (вопрос 2). Я на самом деле не занимаюсь этим типом кодирования; большая часть моего кода очень структурирована по типу.

Я пытался спроектировать промежуточный класс, который наследует DbContext, который затем мог бы наследоваться моими 3 классами, перечисленными выше, но я быстро «потерял кривую преследования».

...