Как работает DbMigrator
У меня есть код, который создает новый DbMigrator(new Configuration())
Configuration
- это пользовательское расширение DbMigrationsConfiguration<T>
, где T - DbContext
Таким образом, в Configuration
существует ContextType, который равен <T>
.
Когда создается экземпляр DbMigrator, он пытается создать экземпляр <T>
DbContext.Он либо попытается использовать пустой конструктор в контексте <T>
, либо попытается найти реализацию IDbContextFactory<...>
, где ...
- фактический тип, но не универсальный тип T.
Как DbMigrator не работает
Проблема в том, что экземпляр сборки DbMigrator
не имеет доступа к конкретному типизированному IDbContextFactory<...>
, который ему необходимо обнаружить.Кроме того, у моего DbContext
нет конструктора по умолчанию, и я этого не хочу.Поэтому я получаю исключение The target context '...' is not constructible.
Меня беспокоит то, что в момент создания экземпляра DbMigrator
у меня уже есть экземпляр (или может уже быть в пределах экземпляра) из DbContext
я мигрирую.Кроме того, у меня есть доступ к универсальному IDbContextFactory<T>
, который не может быть обнаружен внутренними компонентами DbMigrator, но я был бы рад предоставить ему экземпляр.
Вопрос
Так как мне сказатьDbMigrator либо просто использует мой экземпляр Context, либо использует экземпляр IDbContextFactory, который я указал?Когда он пытается скрыть свои магические способности, чтобы попытаться обнаружить эти вещи (предположительно, с помощью отражения / ServiceLocation), он терпит неудачу.
Моя ситуация
В одном домене приложений я использую n
Контексты.Я хотел бы сказать один, но обычно это два, и может быть больше, чем это.Поэтому любое решение, которое использует single свойство app / web config или декоратор атрибута, который указывает на single DbConfiguration или ConnectionFactory, не будет работать для меня.Потому что на AppDomain может быть только один, и, если я не смогу сконфигурировать его в зависимости от контекста, который мне нужен в то время, это бесполезно.Так что там есть место для маневра, но я не знаю.
Также, может быть, есть некоторые дзю-джиу, которых я не понимаю в EF относительно конструктора base
.Но я не верю, что передача DbConnection
в конструктор вместо nameOrConnectionString
будет работать.Это все еще не пустой конструктор.Но если есть что-то, что EF делает для поиска конструкторов с этим и как это использовать, это МОЖЕТ работать.