Предоставить контекст для DbMigrator - PullRequest
1 голос
/ 27 апреля 2019

Как работает 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 делает для поиска конструкторов с этим и как это использовать, это МОЖЕТ работать.

...