Особенности работы приложения с разными базами данных

Подмена строки сервиса данных

SQLDataService имеет специальный делегат

    /// <summary>
    /// Делегат для изменения строки соединения (организация работы с несколькими базами)
    /// </summary>
    /// <param name="types">Массив типов, который получается из объектов пришедших в сервис данных</param>
    /// <returns>Новая строка соединения, если вернётся пустое значение или null, строка не изменится</returns>
    public delegate string ChangeCustomizationStringDelegate(System.Type[] types);

    /// <summary>
    /// Делегат для смены строки соединения
    /// </summary>
    public static ChangeCustomizationStringDelegate ChangeCustomizationString = null;

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

/// <summary>
/// Не менять строку соединения общим делегатом ChangeCustomizationString
/// </summary>
public bool DoNotChangeCustomizationString
{
  get { return _doNotChangeCustomizationString; }
  set { _doNotChangeCustomizationString = value; }
}

Подмена StorageName

Information содержит делегат

/// <summary>
/// Делегат для смены ClassStorageName (можно подставить имя_базы.dbo.имя_таблицы, например)
/// </summary>
/// <param name="classType">Тип класса</param>
/// <param name="originalStorageName">Оригинальный StorageName</param>
/// <returns>новый StorageName (если пустое или null, то возьмём оригинальное)</returns>
public delegate string ChangeClassStorageNameDelegate(Type classType, string originalStorageName);

/// <summary>
/// Делегат для смены ClassStorageName (можно подставить имя_базы.dbo.имя_таблицы, например)
/// </summary>
public static ChangeClassStorageNameDelegate ChangeClassStorageName = null;

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

имя_базы.[dbo].название_класса

Экранировать кавычки в web.config при необходимости можно стандартными средствами XML.