Недоволен текущим принятым ответом на этот вопрос, для меня это скорее анти-ответ, чего не делать. Мое решение здесь применимо сегодня так же, как и в '11
Для поддержки сценария аренды, где данные о каждом пользователе / клиенте всегда будут находиться в одной и той же базе данных, и все схемы данных совпадают, тогда все, что вам нужно сделать, - это изменить строку подключения при создании экземпляра контекста данных.
Еще один термин для этой концепции - Sharding, у MS есть некоторые инструменты и API, которые могут помочь. Это достаточно простое пошаговое руководство: Инструменты базы данных SQL Azure Elastic: Shard Elasticity , но вы можете сделать это довольно легко из первых принципов.
Если замена строки подключения будет работать для вашего сценария, нам нужно определить механизм, который вы будете использовать для определения строки подключения, для этого есть два общих решения:
Простой выход состоит в том, чтобы использовать фиксированные заголовки хоста, маршрут или токен в каждом запросе к службе, затем можно жестко закодировать логику для определения строки соединения без сложной логики сопоставления.
Используйте базу данных master / header / mapping для хранения вашей конфигурации.
Эта база данных имеет отдельную схему, основная цель которой - получить правильную строку подключения для каждого запроса.
В большинстве случаев мы объединяем это с процессом аутентификации, и в этом случае
вы сохраняете аутентификацию в этой центральной базе данных, а не в отдельных базах данных.
С точки зрения контроллера OData, даже с WCF Data Services вам просто нужно реализовать свою логику для получения строки подключения и использовать ее при создании экземпляра контекста данных.
Конечно, это не поможет вам, если данные вашего клиента распределены по нескольким базам данных, но это довольно распространенный шаблон для удаления больших баз данных при необходимости развертывания новой фермы служб для каждой базы данных.