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

Сначала немного об окружающей среде:

Мы используем программу под названием Clearview для управления сервисными отношениями с нашими клиентами, включая колл-центр и работу на местах. Чтобы улучшить поддержку клиентов и наших технических специалистов, мы также разработали веб-сайт для предоставления доступа к записям услуг в Clearview и отчетности. Со временем наша потребность в настройке поведения и добавлении новых функций привела к тому, что все больше и больше вещей привязываются к этому сайту и его базе данных.

На данный момент мы имеем дело с такими вещами, как Компания, определяемая частично в базе данных Clearview и частично в базе данных веб-сайта. Для правильной оценки мы также начинаем связывать скрипты для нашей телефонной системы с тем же веб-сайтом, который также потребует общения с собственной базой данных телефонной системы.

Все это настроено и работает ... НО у нас нет хорошего слоя данных для работы со всем этим. Мы перешли с Linq на SQL, и теперь у нас есть два DBML, которые мы можем использовать, а также некоторые пользовательские классы, которые я написал до того, как услышал о Linq, вместе с некоторыми наборами данных ADO старого стиля. Так что да, в основном все в беспорядке.

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

Я слышал кое-что о Entity Framework, позволяющем создавать классы из нескольких источников, но оказывается, что может быть только одна база данных. Итак, вопрос в том, как я мог продолжить это?

В настоящее время я думаю о том, чтобы все классы Linq To SQL были установлены для каждой базы данных, а затем вручную писать совместимые с Linq интерфейсы, которые связывают их вместе. Похоже, много работы, и с учетом ограничений Linq (например, не в состоянии обновить), я не уверен, что это хорошая идея.

Могу ли я сделать что-то с Entity Framework, что получилось бы лучше? Стоит ли искать другой инструмент? Я сумасшедший?

Ответы [ 3 ]

1 голос
/ 06 января 2009

, если вы хотите использовать такие инструменты, как Linq2SQl или EF, и не хотите управлять несколькими DBMLS (или какими бы то ни было вызванными в EF или другими инструментами), вы можете создать представления в базе данных вашего сайта, которые ссылаются на База данных системы ClearView или Phone.

Это позволяет вам отделить ваш веб-сайт от их структуры базы данных. Я считаю, что Linq2Sql и EF могут использовать представление в качестве источника для сущности. Если они не могут смотреть на nHibernate.

Это также позволит вам иметь составные объекты, которые извлекаются из различных источников данных. Существуют некоторые ограничения при обновлении представлений в SQL Server; тем не менее, вы можете определить свои собственные вместо триггера (ов) в представлении, которые затем могут выполнять фактические операторы вставки обновления удаления.

1 голос
/ 06 января 2009

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

Мой подход к этой проблеме заключается в том, чтобы абстрагироваться от использования Entity Framework за шаблоном Repository. Для меня самое непосредственное преимущество - сделать модульное тестирование очень простым; вместо того, чтобы пытаться смоделировать мою модель Entity, я просто заменяю фиктивный репозиторий, который возвращает IQueryables. Но этот же шаблон действительно хорош для объединения нескольких источников данных или источников данных, для которых нет поставщика Entity Framework, таких как веб-служба, не поддерживающая службы данных.

Так что я не собираюсь говорить: «Не используйте Entity Framework». Мне это нравится, и я использую это сам. Учитывая последние новости от Microsoft, я считаю, что это лучший выбор, чем LINQ to SQL. Но это не решит проблему, которую вы описываете. Используйте шаблон Repository.

0 голосов
/ 28 октября 2010

L2S работает с представлениями, отлично, в моем проекте. Вам нужно только сделать небольшой трюк: 1. Добавьте вторичную таблицу БД в текущую БД в качестве представления. 2. В Designer добавьте атрибут первичного ключа в поле id в представлении. 3. Только сейчас добавьте связь с любой другой таблицей в исходной БД.

Теперь вы можете увидеть представление, доступное для навигации.

...