Я использую единый дизайн базы данных для 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 классами, перечисленными выше, но я быстро «потерял кривую преследования».