Я занимаюсь исследованием Entity Framework и связанных с ним файлов .edmx.
Наша текущая установка содержит ряд этих файлов, скомпилированных в библиотеку, которую мы широко используем.Конечно, это не совсем элегантное решение - каждый раз, когда мы хотим обновить или добавить что-то на уровне базы данных, нам нужно перекомпилировать эту библиотеку.
Мы используем исключительно хранимые процедуры, и наш текущий подход заключается в использовании метода ExecuteFunction
в контексте объекта.Однако для этого требуется знание того, какие импортированные функции из файла edmx возвращают какой тип (context.ExecutionFunction<T>()
возвращает ObjectResult<T>
).
Мое теоретическое решение состоит в том, чтобы хранить любые файлы .edmx, которые мы хотим использовать, относительнопуть, и библиотека загружает их все во время выполнения.
Кто-нибудь пробовал это раньше?Это работает?Есть ли какие-либо соображения по поводу производительности, которые следует учитывать?Это будет использоваться в среде электронной коммерции, поэтому важны эффективность и скорость.
РЕДАКТИРОВАТЬ ДЛЯ НЕСКОЛЬКО ЯРКОСТИ:
Конечно, можно было бы скомпилировать каждого человека.Файл EDMX в свою собственную сборку, что может позволить использовать this .Любые входные данные тоже будут хороши.
Вызов, который мы сейчас делаем, выглядит примерно так:
Database.MakeCall<T>("stored_procedure_name", parametersCollection, KnownDatabases.Database);
В своем конструкторе обработчик базы данных будет хранить экземпляры каждой базы данных.контексты, о которых он знает (каждый из файлов .edmx в библиотеке).Используя перечисление KnownDatabases
, он выбирает, с какой базой данных будет выполняться запрос.
В идеале я хотел бы выполнить такой вызов:
Database.MakeCall<T>("context_name", "stored_procedure_name", parametersCollection);
Где в обработчике базы данныхв своем конструкторе будет искать в папке файлы .edmx и загружать их все, а затем сохранять экземпляры каждого контекста в соответствии с именем контекста.То, как T
будет определено или получено, сейчас немного размыто.
В обоих случаях тип возвращаемого значения будет ObjectResult<T>