Как частично перенести базу данных в новую систему со временем? - PullRequest
3 голосов
/ 09 июня 2009

Мы находимся в процессе многолетнего проекта, в котором мы строим новую систему и новую базу данных, чтобы в конечном итоге заменить старую систему и базу данных. Пользователи используют новые и старые системы, поскольку мы их меняем.

Проблема, с которой мы продолжаем сталкиваться, заключается в том, что объект в одной системе зависит от объекта в другой системе. Мы использовали представления , но столкнулись с ограничением одной из технологий (Entity Framework) и рассматриваем другие варианты.

Другой вариант, который мы сейчас рассмотрим, это replication . Мой босс не взволнован дополнительным обслуживанием, которое могло бы вызвать. Итак, какие еще есть варианты для получения зависимых данных в базе данных, которая нуждается в этом?

Обновление:

Используемые нами технологии: SQL Server 2008 и Entity Framework. Обе базы данных находятся в одном экземпляре сервера sql, поэтому связанные серверы не нужны.

Ограничение, с которым мы сталкиваемся в Entity Framework, заключается в том, что мы не можем создать отношения между объектами на основе таблиц и объектами на основе представлений. Насколько я знаю, в базе данных не может существовать никакой связи между представлением и таблицей, поэтому диаграмма edmx не может это сделать. И я не могу создать отношения вручную, не получив ошибок. Он считает, что все столбцы в представлении являются ключами.

Если я оставлю это так, я получу такую ​​ошибку для каждого столбца в представлении:

Свойство [...] ключа ассоциации конца не нанесен на карту.

Если я пытаюсь изменить свойство «Entity Key» на false для столбцов, которые не являются ключом, я получаю эту ошибку:

Все ключевые свойства EntitySet [...] должен быть сопоставлен со всеми ключевые свойства [...] таблицы VIEWNAME .

Согласно этому сообщению на форуме это звучит как ограничение Entity Framework.

Обновление № 2

Я должен также упомянуть, что основным ограничением Entity Framework является то, что он поддерживает только одну базу данных одновременно. Поэтому нам нужно, чтобы старые данные были в новой базе данных, чтобы Entity Framework мог их увидеть. Нам нужен только доступ на чтение старых системных данных в новой системе.

Ответы [ 4 ]

1 голос
/ 09 июня 2009

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

В зависимости от того, насколько актуальными должны быть данные в каждой базе данных, и если один источник данных может оставаться доступным только для чтения, вы можете:

  1. Использование мастера копирования базы данных для создания пакета служб SSIS который вы можете периодически запускать как задачу агента SQL
  2. Использовать репликацию моментальных снимков
  3. Создание собственного процесса ввода / вывода BCP чтобы получить данные для другой базы данных
  4. Использовать репликацию транзакций, которая может быть почти в реальном времени.

Если данные должны быть доступны для чтения и записи в обеих базах данных, вы можете использовать:

  1. репликация транзакций с обновить подписку
  2. репликация слиянием

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

РЕДАКТИРОВАТЬ: Если это один и тот же сервер, то, как предлагает другой пользователь, вы сможете получить доступ к таблице с помощью servername.databasename.schema.tablename вопрос БД.

0 голосов
/ 11 июня 2009

Спасибо за ответы. Мы собираемся попробовать добавить триггеры к старым таблицам базы данных, чтобы вставить / обновить / удалить записи в новых таблицах новой базы данных. Таким образом, мы можем продолжать использовать Entity Framework, а также выполнять любые необходимые нам преобразования данных.

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

Одна вещь, которую я понял, должна произойти, прежде чем мы сможем сделать это, мы должны найти во всем нашем коде и sql @@ Identity и заменить его на scope_identity (), чтобы триггеры не испортили Ids система.

0 голосов
/ 10 июня 2009

Если Linq-to-Entities не может пересекать базы данных, то будет работать только репликация или что-то, что эмулирует ее.

В целях повышения производительности вы, вероятно, захотите использовать репликацию слиянием или транзакцию с обновлением в очереди (не сразу).

0 голосов
/ 10 июня 2009

Я не знаю о EntityToSql, но знаю, что в LinqToSql вы можете подключиться к нескольким базам данных / серверам в одном .dbml, если вы префикс таблиц:

ServerName.DatabaseName.SchemaName.TableName 

MyServer.MyOldDatabase.dbo.Customers

Мне удалось щелкнуть таблицу в .dbml, скопировать и вставить ее в .dbml альтернативного проекта с префиксом имени и установить отношения, и это работает ... как я уже говорил, это было в LinqToSql , хотя не пробовал это с EntityToSql. Я бы дал выстрел, прежде чем идти, хотя вся работа репликации и тому подобное.

...