#sql-server #web-services #entity-framework-4
#sql-server #веб-сервисы #entity-framework-4
Вопрос:
Я хотел бы разработать приложение, которое обслуживает несколько клиентов
Я хотел бы иметь данные для разных клиентов в одной базе данных, но данные каждого клиента в его / ее собственной схеме
, чтобы:
- 1 БД с несколькими схемами
- каждая схема представляет 1 клиента
- для каждого клиента выполняется одна и та же программа, поэтому у каждого клиента одинаковые таблицы сгруппированы по его / ее схеме
Вопросы:
- будет ли этот сценарий работать с EF4?
- есть ли 1 веб-сервис, который обслуживает всех клиентов?
- укажите EF4 для каждой информации о клиенте, чтобы исправить схему?
- как мне переключаться между схемами во время запросов веб-службы?
Ответ №1:
Это возможно, но это намного сложнее, чем кажется. Файл EDMX состоит из трех частей, которые определяют метаданные сопоставления: SSDL (описание базы данных), CSDL (описание объектов), MSL (сопоставление между SSDL и CSDL). Информация о схеме является частью SSDL. Если вы хотите получить доступ к другой схеме, вы должны переключить весь документ SSDL = вам нужно новое подключение объекта или строка подключения. Вы также должны создать SSDL для каждого клиента.
Вот пример объявления SSDL для одного объекта (вы можете увидеть схему, определенную на edmx:model/Schema/EntityContainer/EntitySet/@Schema
):
<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace="Model.Store" Alias="Self" Provider="System.Data.SqlClient"
ProviderManifestToken="2008"
xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
<EntityContainer Name="ModelStoreContainer">
<EntitySet Name="TestEntitySet" EntityType="Model.Store.TestEntitySet"
store:Type="Tables" Schema="dbo" />
</EntityContainer>
<EntityType Name="TestEntitySet">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="int" StoreGeneratedPattern="Identity"
Nullable="false" />
</EntityType>
</Schema>
</edmx:StorageModels>
- Да, это сработало бы, но, как я описал, это не очень хорошее решение.
- Да, у вас может быть одна служба, которая обслуживает всех клиентов, но вы должны разработать правильную аутентификацию для подключения к правильному набору таблиц. У вашей компании могут возникнуть очень большие юридические проблемы, если вы работаете с конфиденциальными данными, и ваш клиент случайно (из-за ошибки) получит доступ к данным другого клиента.
- Проблема аутентификации и сопоставления аутентифицированных пользователей с правильным набором таблиц — это полностью выходит за рамки EF.
- Вы будете использовать либо несколько строк подключения (по одной для каждого клиента), либо вы будете создавать подключение объекта динамически.
Правильный подход здесь заключается в создании новой базы данных для каждого клиента. Это более удобно в обслуживании, и настройка безопасности для такого сценария намного проще.
Комментарии:
1. итак, если регистрируется новый клиент, мне пришлось бы создать новую схему со всеми таблицами, скопировать ssdl, изменить все ссылки на схему на «newSchema», затем для каждого доступа (в моем случае n-уровневый вызов веб-службы) создать connectionstring, а остальная часть программы остается незатронутой. похоже, это может сработать правильно?
2. Да, это могло бы быть, но это не очень хорошее решение.
Ответ №2:
Я не могу разобраться в вашем вопросе. Я не могу понять, зачем вам понадобилось бы несколько схем…
Мне кажется, вам просто нужно добавить поле внешнего ключа CustID в таблицы верхнего уровня, чтобы вы могли использовать объединения для фильтрации данных по клиенту, используя ту же схему…
Возможно, ваш вопрос требует более подробной информации…
Комментарии:
1. — если вам нужна только 1 база данных, потому что это экономит деньги. — с n dbs у вас все еще возникает аналогичная проблема со строкой подключения. — добавление полей в n-таблицы для разделения клиентов намного опаснее, чем разделение строки подключения
Ответ №3:
Ничего подобного я не пробовал, но с FluentNHibernate было бы проще — вы наверняка можете указать сходство схемы в коде там.
Также можно было бы решить это с помощью направления конфигурации — пользователи SQL могут установить схему по умолчанию, чтобы вы могли ссылаться на все, что не содержит схемы, а затем оно будет запущено в производство, предполагая, что конфигурация правильная.