Вы также можете сделать это с представлениями (и связанным сервером, если другая база данных находится на другом сервере).Это избавит вас от необходимости управлять / объединять два отдельных файла EDMX.Я использовал это со связанным сервером для чтения данных из второй базы данных на другом сервере, но провел несколько быстрых тестов, чтобы увидеть, возможны ли обновления / вставки / удаления, и они есть.
У меня нет опыта работы с распределенными транзакциями, поэтому информация, относящаяся к распределенным транзакциям, может быть хорошей, плохой или немного и той, и другой. Если ваши две базы данных находятся на одном сервере, я ASSUME распределенные транзакции больше не применяются.
При использовании связанного сервера следует учитывать несколько моментов.
- При изменении сущностей в связанных таблицах БД ивызовите
SaveChanges
в вашем контексте, это попытается запустить распределенную транзакцию, поэтому, если никто не знает, как это остановить, вам нужно убедиться, что два сервера настроены для обработки распределенных транзакций.(Я хотел бы предположить, что это будет верно и при использовании синонимов). - Вставки в сущности со столбцами идентификаторов на связанном сервере выдают исключение, потому что ef пытается получить новый идентификатор, используя
SCOPE_IDENTITY()
, и он равен nullЯ не знаю, есть ли способ обойти это.У меня не было проблем с обновлением или удалением объектов на связанном сервере со столбцами идентификаторов.
В SQL Server A
- создайте связанныйсервер на серверB (пропустите это, если базы данных находятся на том же сервере).
- создайте представление в
[ServerA].[MyDB]
для каждой таблицы в [ServerB].[AnotherDB]
, к которой вы хотите получить доступ
В EDMX
- Добавить свои представления в файл edmx
- Очистить настройку ключа объекта из каждого свойства в конструкторе (включая фактический pk)
- Сброс ключа объекта для фактического pk
- Добавление связей по мере необходимости
- Сохранение изменений
Для обновлений / Вставок / удалений
- щелкните правой кнопкой мыши по файлу edmx и откройте в редакторе xml
- Перейдите к
StorageModel
-> Schema
-> EntityContainer
- Найдите набор сущностей длявашей сущности и удалите элемент
DefiningQuery
- Найдите атрибут
store:Schema
в наборе сущностей и удалите store:
так, чтобы он был просто Schema
.Оставьте его значение в покое. - Повторите шаги 3 и 4 для каждого представления со связанного сервера
- Сохраните изменения
Поскольку использование связанного сервера создает распределенную транзакцию Iпришлось сделать пару вещей на ObjectContext
до того, как SaveChanges
был успешным.
ctx.Connection.Open();
ctx.ExecuteStoreCommand("set xact_abort on");
ctx.SaveChanges();
ctx.Connection.Close();
Возможно, вы можете создать пользовательский ObjectContext
и переопределить SaveChanges
, чтобы добавить этот материал.