EF4, как переключить схему (например, dbo -> custId), чтобы идентичные таблицы сохранялись в нескольких схемах - PullRequest
2 голосов
/ 26 апреля 2011

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

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

Вопросы:

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

Ответы [ 3 ]

1 голос
/ 26 апреля 2011

Это возможно, но гораздо сложнее, чем кажется. Файл 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. Вы будете использовать либо несколько строк соединения (по одной на каждого клиента), либо вы будете создавать соединение сущностей динамически.

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

0 голосов
/ 26 апреля 2011

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

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

0 голосов
/ 26 апреля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...