Создание Entity Framework Model охватывает несколько баз данных - PullRequest
29 голосов
/ 17 мая 2011

Допустимо ли сделать что-то типа

CREATE SYNONYM [dbo].[MyTable] FOR [AnotherDatabase].dbo.[MyTable]

, а затем изменить файл edmx Entity Framework для чтения этого объекта так же, как и для любой другой таблицы?

Я сделал быстрый тестовый образец, и, кажется, он отлично работает для выбора и обновления, но я хотел знать, есть ли какая-то причина, почему я не должен делать это

Я получаюопределение таблицы путем создания файла edmx, указывающего на 2-ю базу данных, построения там сущностей, а затем копирования / вставки определения в файл edmx 1-й базы данных.

UPDATE

Если кому-то интересно, я написал, что сделал, чтобы файл edmx охватывал несколько баз данных здесь .Он включает в себя сценарии для генерации синонимов и объединения файлов EDMX.

Ответы [ 3 ]

11 голосов
/ 18 мая 2011

Если вы сделали тест, и он сработал, вы, вероятно, показали что-то, о чем никто не знает. До сих пор я всегда отвечал на этот тип вопроса: невозможно использовать одну модель с двумя базами данных (с более уродливым обходным решением, основанным на представлениях, скрывающих таблицы из второй базы данных). Теперь я знаю два обходных пути.

Единственным недостатком этого подхода является то, что все изменения, внесенные вручную в SSDL-часть вашего EDMX, всегда теряются, если вы запускаете Обновление модели из базы данных . Это означает либо ручную разработку EDMX (что является довольно тяжелой работой), либо использование некоторого инструмента / скрипта, который будет добавлять ваши изменения после каждого обновления из базы данных.

2 голосов
/ 25 мая 2011

Вы также можете сделать это с представлениями (и связанным сервером, если другая база данных находится на другом сервере).Это избавит вас от необходимости управлять / объединять два отдельных файла EDMX.Я использовал это со связанным сервером для чтения данных из второй базы данных на другом сервере, но провел несколько быстрых тестов, чтобы увидеть, возможны ли обновления / вставки / удаления, и они есть.

У меня нет опыта работы с распределенными транзакциями, поэтому информация, относящаяся к распределенным транзакциям, может быть хорошей, плохой или немного и той, и другой. Если ваши две базы данных находятся на одном сервере, я ASSUME распределенные транзакции больше не применяются.

При использовании связанного сервера следует учитывать несколько моментов.

  1. При изменении сущностей в связанных таблицах БД ивызовите SaveChanges в вашем контексте, это попытается запустить распределенную транзакцию, поэтому, если никто не знает, как это остановить, вам нужно убедиться, что два сервера настроены для обработки распределенных транзакций.(Я хотел бы предположить, что это будет верно и при использовании синонимов).
  2. Вставки в сущности со столбцами идентификаторов на связанном сервере выдают исключение, потому что ef пытается получить новый идентификатор, используя SCOPE_IDENTITY(), и он равен nullЯ не знаю, есть ли способ обойти это.У меня не было проблем с обновлением или удалением объектов на связанном сервере со столбцами идентификаторов.

В SQL Server A

  1. создайте связанныйсервер на серверB (пропустите это, если базы данных находятся на том же сервере).
  2. создайте представление в [ServerA].[MyDB] для каждой таблицы в [ServerB].[AnotherDB], к которой вы хотите получить доступ

В EDMX

  1. Добавить свои представления в файл edmx
  2. Очистить настройку ключа объекта из каждого свойства в конструкторе (включая фактический pk)
  3. Сброс ключа объекта для фактического pk
  4. Добавление связей по мере необходимости
  5. Сохранение изменений

Для обновлений / Вставок / удалений

  1. щелкните правой кнопкой мыши по файлу edmx и откройте в редакторе xml
  2. Перейдите к StorageModel -> Schema -> EntityContainer
  3. Найдите набор сущностей длявашей сущности и удалите элемент DefiningQuery
  4. Найдите атрибут store:Schema в наборе сущностей и удалите store: так, чтобы он был просто Schema.Оставьте его значение в покое.
  5. Повторите шаги 3 и 4 для каждого представления со связанного сервера
  6. Сохраните изменения

Поскольку использование связанного сервера создает распределенную транзакцию Iпришлось сделать пару вещей на ObjectContext до того, как SaveChanges был успешным.

ctx.Connection.Open();
ctx.ExecuteStoreCommand("set xact_abort on");
ctx.SaveChanges();
ctx.Connection.Close();

Возможно, вы можете создать пользовательский ObjectContext и переопределить SaveChanges, чтобы добавить этот материал.

0 голосов
/ 09 декабря 2017

Я обнаружил, что этот трюк с синонимами работает отлично с подходом "Code first" без каких-либо манипуляций с файлами edmx!

Единственное, что вам нужно сделать, это«привязать» ваш класс к соответствующему синониму в методе OnModelCreating вашего DataContext.

Например, , если у меня есть синоним к таблице Personnel в другой БД (имя класса также Personnel), а имя синонима "myschema.MySynonym" , тогда метод OnModelCreating должен выглядеть следующим образом:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("myschema");

        modelBuilder.Entity<Personnel>()
            .ToTable("MySynonym");

        Database.SetInitializer<TestSynonymContext>(null);

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