Переменный ключ с несколькими полями EF Association? - PullRequest
1 голос
/ 08 декабря 2010

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

Например:

-Customer-     -Rep-
CompanyID      CompanyID
StoreID        StoreID
RepID          RepID
CustID  

В некоторых случаях клиенты Клиента идентифицируются путем присоединения к CompanyID, StoreID, RepID. В других развертываниях Store ID Представителя будет строкой пробелов, и затем соединение происходит по CompanyID, RepID. Клиент по-прежнему будет иметь значения в StoreID.

В SQL я просто помещаю 'OR StoreID = "" ", где мы объединяемся, в поля StoreID, но я не вижу, как я могу сделать это с помощью структуры сущностей.

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

Edit:

Похоже, я могу использовать MetadataWorkspace для создания необходимой ассоциации на лету. Я буду исследовать это.

Edit:

Проблема такого рода может быть решена путем разделения модели на использование разных файлов csdl (где определяются ассоциации) в зависимости от того, какое поведение требуется. См. Ответ MerickOWA и ссылку на статью MSDN. Это приводит к небольшому раздражению, в первую очередь из-за того, что дизайнер не поддерживает его, поэтому вы будете ограничены редактированием файлов XML, а также вам придется контролировать, какой ресурс csdl используется. Csdl указывается в строке подключения EF, которая по умолчанию находится в app.config. Чтобы упростить управление этой строкой (в любом случае мне нужно было контролировать строку подключения к базе данных), я написал служебный класс для построения строки подключения EF. Я основал этот класс на коде, найденном в Исправление конфигурации: Использование Entity Framework в общих библиотеках .

Ответы [ 2 ]

1 голос
/ 09 декабря 2010

Одна из возможностей, на которую вы можете обратить внимание, - это попытка разбить файл edmx на его части CSDL, SSDL и MSL.

CSDL - это макет объекта сущности, а SSDL - макет таблицы, а MSL отображается между ними.

Возможно, вы можете попробовать использовать один CSDL с двумя или более SSDL / MSL для обработки баз данных с разным расположением столбцов.

У меня нет большого опыта использования этой ситуации, но это, конечно, кажется возможным.

Проверьте эту статью на MSDN

0 голосов
/ 09 декабря 2010

Я согласен с RPM1984, что в любом случае вы столкнетесь с кошмаром обслуживания, если вы не будете осторожны - возможно, вам следует рассмотреть возможность размещения внешних ключей на всех трех столбцах, но позволить StoreId быть нулевым, а затем рассмотреть возможность использования наследования в вашей моделиопределить сущность, которая сопоставляется с таблицей, а затем расширить эту сущность для Customer & Rep и включить бизнес-логику, специфичную для каждого, в соответствующие классы ...

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