Изменить схему базы данных Entity Framework во время выполнения - PullRequest
10 голосов
/ 27 ноября 2009

В большинстве приложений asp.net вы можете изменить хранилище базы данных, изменив строку подключения во время выполнения. то есть я могу перейти от использования тестовой базы данных к рабочей базе данных, просто изменив значение поля «база данных» в строке подключения

Я пытаюсь изменить схему (но не обязательно саму базу данных) с помощью структуры сущностей, но не удача.

Проблема, с которой я сталкиваюсь, заключается в том, что содержимое SSDL в XML-файле edmx хранит схему для каждого набора сущностей.

см. Ниже

<EntitySet 
    Name="task" 
    EntityType="hardModel.Store.task" 
    store:Type="Tables" 
    Schema="test"  />

Теперь я изменил значение атрибута схемы на «prod» из теста, и это работает ..

Но, похоже, это не очень хорошее решение.

  1. Мне нужно обновить набор объектов evert, а также хранимые процедуры (у меня +50 таблиц)
  2. Я могу сделать это только во время компиляции?
  3. Если затем я попытаюсь обновить уже существующие сущности модели сущностей, они читаются из-за того, что EF не распознает, что таблица уже существует в EDM.

Есть мысли?

Ответы [ 8 ]

6 голосов
/ 23 января 2012

У меня такая же проблема, и она действительно довольно раздражающая, потому что это один из тех случаев, когда Microsoft действительно пропустила лодку. Половина причины использования EF - поддержка дополнительных баз данных, но если вы сначала не введете код, который на самом деле не решит проблему.

В MS SQL изменение схемы имеет мало смысла, поскольку схема является частью идентификатора таблиц. Для других типов баз данных схема в значительной степени не является частью идентификатора базы данных и определяет только местоположение базы данных. Подключение к Oracle, изменение базы данных и изменение схемы по сути являются синонимами.

2 голосов
/ 06 декабря 2009

Извините, это не верный ответ, но я нашел этот проект в codeplex (а также в этом вопросе), пока искал похожую проблему:

http://efmodeladapter.codeplex.com/

Особенности включают в себя:

  • Настройка времени выполнения схемы модели, в том числе:
  • Настройка таблицы уровня данных префиксы или суффиксы
  • Регулировка владелец объектов базы данных

Некоторые коды из документов:

public partial class MyObjectContext : BrandonHaynes.ModelAdapter.EntityFramework.AdaptingObjectContext
{
        public MyObjectContext() 
        : base(myConnectionString, 
        new ConnectionAdapter(
            new TablePrefixModelAdapter("Prefix", 
                new TableSuffixModelAdapter("Suffix")), 
        System.Reflection.Assembly.GetCallingAssembly()))
    {
    ...
    }

}

Похоже, это именно то, что вы ищете.

2 голосов
/ 02 декабря 2009

Обновление После прочтения ваших комментариев становится ясно, что вы хотите изменить ссылочную схему для каждой БД, , а не базы данных. Я отредактировал вопрос, чтобы уточнить это и восстановить предоставленный вами образец EDMX, который был скрыт в исходном формате.

Я повторю свой комментарий ниже здесь:

Если схемы находятся в одной и той же БД, вы не сможете переключать их во время выполнения (за исключением только кода EF 4). Это связано с тем, что две идентичные и структурированные таблицы в двух разных схемах считаются совершенно разными таблицами.

Я также согласен с JMarsch выше: я бы пересмотрел проект помещения тестовых и производственных данных (или, собственно, « что-нибудь и производственных данных») в одну и ту же БД. Похоже на приглашение к катастрофе.

Старый ответ ниже.

Вы уверены, что изменяете правильную строку подключения? Строка подключения, используемая EF, встроена в строку подключения, которая указывает местоположение CSDL / SSDL / и т. Д. Обычно имеется «нормальная» строка подключения для использования какой-либо другой частью вашего приложения (например, членство в ASP.NET). В этом случае при смене БД необходимо обновить обе строк подключения.

Аналогично, если вы обновляете строку подключения во время выполнения, вы должны использовать специальные инструменты для этого , которые понимают формат строки подключения EF и отделены от обычного компоновщика строки подключения. Смотрите пример в ссылке. См. Также эту справку о назначении строк подключения EF .

1 голос
/ 14 августа 2013

Вот похожий вопрос с лучшим ответом: Изменение имени схемы во время выполнения - Entity Framework

Решение, которое сработало для меня, было разработано Яном Матусеком.

1 голос
/ 01 декабря 2009

Когда я создаю новую модель данных объекта ADO.NET, для редактирования в представлении конструктора доступны два свойства «Имя контейнера объекта» и «Пространство имен». Используя namespace.EntityContainerName, вы можете создать новый экземпляр указание строки подключения.

MyEntities e = new MyEntities("connstr");<br> e.MyTable.Count();

Я не уверен, поможет ли это вам или нет, удачи!

Кроме того, это хороший случай для нескольких слоев (не обязательно должен быть проектом, но может быть).

Решение
* DataAccess - объекты здесь
* Сервис - Обертывает доступ к DataAccess
* Consumer - Calls Service

В этом сценарии потребитель вызывает службу, передавая любой фактор, определяющий, какая строка подключения используется. Затем служба создает экземпляр доступа к данным, передавая соответствующую строку подключения, и выполняет запрос потребителя.

1 голос
/ 27 ноября 2009

Самый простой способ решить эту проблему - вручную удалить все записи, такие как 'Schema = "SchemaName"' из части модели SSDL.
В этом случае все работает хорошо.

1 голос
/ 27 ноября 2009

Строка подключения для EF находится в файле конфигурации. Нет необходимости менять файл SSDL.

EDIT

У вас есть схема prod и test в одной базе данных?

Если да, вы можете исправить это, используя отдельную базу данных для тестирования и тестирования. Использование одного и того же имени схемы в обеих базах данных.

Если Нет, вы можете исправить это, используя одно и то же имя схемы в обеих базах данных.

Если у вас будут абсолютно разные имена схем, создайте две модели EF, одну для теста и одну для prod, затем выберите, какой из них использовать в коде, основываясь на значении в вашем файле конфигурации.

0 голосов
/ 29 декабря 2009

Решил мою проблему, переместившись на sql сервер и уйдя от mysql.

Mysql и Mssql по-разному интерпретируют "схемы". Схемы в MySQL являются такими же / синонимами к базам данных. Когда я создал модель, имя схемы, которое совпадает с именем базы данных, жестко закодировано в сгенерированной модели xml. В Mssql по умолчанию используется схема "dbo", которая жестко запрограммирована, но это не проблема, поскольку в mssql схемы и базы данных различаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...