EF4 как переключить схему (например, dbo -> CustID), чтобы идентичные таблицы хранились в нескольких схемах

#sql-server #web-services #entity-framework-4

#sql-server #веб-сервисы #entity-framework-4

Вопрос:

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

  • 1 БД с несколькими схемами
  • каждая схема представляет 1 клиента
  • для каждого клиента выполняется одна и та же программа, поэтому у каждого клиента одинаковые таблицы сгруппированы по его / ее схеме

Вопросы:

  1. будет ли этот сценарий работать с EF4?
  2. есть ли 1 веб-сервис, который обслуживает всех клиентов?
  3. укажите EF4 для каждой информации о клиенте, чтобы исправить схему?
  4. как мне переключаться между схемами во время запросов веб-службы?

Ответ №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>
  
  1. Да, это сработало бы, но, как я описал, это не очень хорошее решение.
  2. Да, у вас может быть одна служба, которая обслуживает всех клиентов, но вы должны разработать правильную аутентификацию для подключения к правильному набору таблиц. У вашей компании могут возникнуть очень большие юридические проблемы, если вы работаете с конфиденциальными данными, и ваш клиент случайно (из-за ошибки) получит доступ к данным другого клиента.
  3. Проблема аутентификации и сопоставления аутентифицированных пользователей с правильным набором таблиц — это полностью выходит за рамки EF.
  4. Вы будете использовать либо несколько строк подключения (по одной для каждого клиента), либо вы будете создавать подключение объекта динамически.

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

Комментарии:

1. итак, если регистрируется новый клиент, мне пришлось бы создать новую схему со всеми таблицами, скопировать ssdl, изменить все ссылки на схему на «newSchema», затем для каждого доступа (в моем случае n-уровневый вызов веб-службы) создать connectionstring, а остальная часть программы остается незатронутой. похоже, это может сработать правильно?

2. Да, это могло бы быть, но это не очень хорошее решение.

Ответ №2:

Я не могу разобраться в вашем вопросе. Я не могу понять, зачем вам понадобилось бы несколько схем…

Мне кажется, вам просто нужно добавить поле внешнего ключа CustID в таблицы верхнего уровня, чтобы вы могли использовать объединения для фильтрации данных по клиенту, используя ту же схему…

Возможно, ваш вопрос требует более подробной информации…

Комментарии:

1. — если вам нужна только 1 база данных, потому что это экономит деньги. — с n dbs у вас все еще возникает аналогичная проблема со строкой подключения. — добавление полей в n-таблицы для разделения клиентов намного опаснее, чем разделение строки подключения

Ответ №3:

Ничего подобного я не пробовал, но с FluentNHibernate было бы проще — вы наверняка можете указать сходство схемы в коде там.

Также можно было бы решить это с помощью направления конфигурации — пользователи SQL могут установить схему по умолчанию, чтобы вы могли ссылаться на все, что не содержит схемы, а затем оно будет запущено в производство, предполагая, что конфигурация правильная.