Entity Framework 4.1: есть ли способ переключения схемы во время выполнения - PullRequest
1 голос
/ 10 ноября 2011

до сих пор (EFv1) мы использовали это решение: http://efmodeladapter.codeplex.com/ после обновления до .NET Framework 4.0 мы ищем встроенный способ изменения схемы во время выполнения при использовании Entity Framework 4.0 / 4.1?

Если быть более точным, у нас есть две большие схемы в БД (A и B) и только схема A, добавленная в модель. таблицы в A и B идентичны. Я ищу решение для переключения между A и B во время выполнения.

Ответы [ 5 ]

1 голос
/ 10 ноября 2011

Я могу предложить вам две модели отдельно.И в зависимости от условий использования того или другого.Например,

void Foo(DbContext model) {
    if (model.GetType() == typeof(FooNamespace.MyFooModel)){
        var db = model as FooNamespace.MyFooModel;
        //Do stuff
    } else {
        var db = model as BarNamespace.MyBarModel;
        //Do stuff
    }
}

Если ваши модели имеют некоторые сходства, чем вы можете использовать какой-то интерфейс.Если ваши модели имеют некоторые общие атрибуты, т. Е. Оба они имеют Category объекты, то наличие двух разных пространств имен для моделей решает проблему.

1 голос
/ 13 августа 2012

Как говорит Ладислав, вы можете использовать два файла SSDL,

Вот как это сделать.

  • Щелкните правой кнопкой мыши по файлу .edmx и выберите свойства
  • измените «Обработка артефактов метаданных» на Копировать в выходной каталог
  • открыть файл .ssdl из выходного каталога
  • заменить все Схема = "dbo" to Schema = "A"
  • Сохранить файл как a.ssdl
  • Инициализировать ваш DbContext, используя следующую строку подключения

    metadata = ~/bin/Model1.csdl|~/bin/a.ssdl|~/bin/Model1.msl;provider=System.Data.SqlClient;provider Строка подключения = 'источник данных =. \ SQLEXPRESS; исходный каталог =; интегрированная безопасность =True; множественные активные результаты = True; App = EntityFramework '; ";

1 голос
/ 10 ноября 2011

Нет.Схема является частью файла отображения .Возможны следующие варианты:

  • Не использовать файлы сопоставления в качестве ресурсов.Измените файл SSDL во время выполнения.
  • Используйте два разных файла SSDL и создайте строку подключения во время выполнения.
0 голосов
/ 14 мая 2014

Решение в c # Entity Framework EF 4.1 Изменение схемы и имени базы данных во время выполнения работает хорошо. Это в основном меняет схему в ресурсе SSDL во время выполнения, поэтому нет необходимости генерировать новый SSDL для каждой используемой схемы.

0 голосов
/ 23 апреля 2013

Это мой взгляд на похожий сценарий (очень похожий на ответ @Greatran, но я не смог найти элемент Обработка артефактов метаданных элемент свойства в моем файле .EDMX):

  1. Создайте хотя бы один раз ваш проект, содержащий файл EDMX
  2. Получить копию сгенерированного файла .SSDL, содержащегося в подпути
    Your\Project\Folder\<strong>obj\Debug\edmxResourcesToEmbed\</strong>Your\EDMX\Namespace\
  3. Скопируйте и включите его в свой проект, например, в том же каталоге, что и файл EDMX: ...\Your\EDMX\Namespace\MyModel.ssdl
  4. Переименуйте его, добавив суффикс, соответствующий вашей среде развертывания, например, для среды Debug это будет MyModel.Debug.ssdl
  5. Из его свойств файла установите Действие построения на Embedded Resource
  6. Получить копию связанной строки подключения к контексту из файла Web.config веб-проекта. Это должно быть что-то вроде
<strong>connectionString="metadata=res://\*/</strong>XXXXX.MyModel<strong>.csdl|
res://*/</strong>XXXXX.MyModel<strong>.ssdl|
res://*/</strong>XXXXX.MyModel<strong>.msl; 
provider=</strong>ZZZZZ;<strong>provider connection string=</strong>'AAAAA'<strong>" </strong>
  1. Преобразуйте эту строку подключения в файле конфигурации веб-проекта для вашей среды развертывания, скажем, Web.Debug.config, чтобы заменить файл SSDL, созданный EDMX, вашим пользовательским файлом SSDL:
<strong>connectionString="metadata=res://\*/</strong>XXXXX.MyModel<strong>.csdl|
res://*/</strong>YYYYY.MyModel.Debug<strong>.ssdl|
res://*/</strong>XXXXX.MyModel<strong>.msl;
provider=</strong>ZZZZZ;<strong>provider connection string=</strong>'BBBBB'<strong>" </strong>

Последний пункт может быть сложным, по крайней мере, по моему опыту, поскольку пространство имен сгенерированного EDMX ресурса SSDL отличается от пространства имен моего пользовательского ресурса SSDL. Чтобы получить точное пространство имен для моего пользовательского ресурса, я запустил сеанс отладки в VS и проверил вывод this.GetType().Assembly.GetManifestResourceNames() в Immediate Window (спасибо stu432 ).

Кроме того, я изменил часть connection string ='AAAAA', чтобы она соответствовала серверу БД в среде развертывания.

...