Сущности и сайт динамических данных: ссылки между таблицами - PullRequest
0 голосов
/ 15 июня 2009

У меня есть две таблицы:

CREATE TABLE [dbo].[Context] (
  [Identity] int IDENTITY (1, 1) NOT NULL, 
  [Naam] nvarchar (255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
  [Code] nvarchar (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
  [Omschrijving] ntext COLLATE SQL_Latin1_General_CP1_CI_AS NULL) ; 
ALTER TABLE [dbo].[Context] 
  ADD CONSTRAINT [PK_Context] 
      PRIMARY KEY ([Identity]) ; 
ALTER TABLE [dbo].[Context] 
  ADD CONSTRAINT [IX_Context_Naam] 
      UNIQUE ([Naam]) ; 
ALTER TABLE [dbo].[Context] 
  ADD CONSTRAINT [IX_Context_Code] 
      UNIQUE ([Code]) ; 
CREATE TABLE [dbo].[Component] (
  [Identity] int IDENTITY (1, 1) NOT NULL, 
  [ContextLink] int NOT NULL, 
  [Naam] nvarchar (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
  [Code] nvarchar (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
  [Omschrijving] ntext COLLATE SQL_Latin1_General_CP1_CI_AS NULL) ; 
ALTER TABLE [dbo].[Component] 
  ADD CONSTRAINT [FK_ComponentContext] 
      FOREIGN KEY ([ContextLink]) 
        REFERENCES [dbo].[Context] ([Identity]) ; 

(Выше сценария должны создать оба.) По сути, у меня есть таблица компонентов, которая ссылается на таблицу контекста.

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

Однако, когда я смотрю на таблицу компонентов в DDS, я замечаю, что ссылка показывает поле контекста code , а не поле Name . Итак, как заставить DDS использовать поле «Имя» вместо отображения ссылки на контекстную таблицу?

(Желательно с помощью чего-то простого, поскольку я имею дело с более чем 60 таблицами, похожими на эту. Большинство из них - простые таблицы поиска, облегчающие фильтрацию.)

Поскольку мы не собираемся работать на стороне GUI этого веб-приложения в течение нескольких месяцев, невозможно изменить что-либо в самом источнике DDS. Если это можно исправить в базе данных или модели Entity, пожалуйста, дайте мне знать!


Модель данных, которую я использую для этого проекта, проста: у каждой таблицы есть первичный ключ «Идентичность», который является полем autoIncrement. Поля Code и Naam (name) предназначены для описания конкретных данных и используются в других приложениях для заполнения комбинированных списков и фильтров. Эти приложения не взаимодействуют напрямую с базой данных, но используют XML-экспорт на основе базы данных. В этом экспортном XML ссылки на «Идентичность» заменяются ссылками на «Код». Это позволяет пользователю изменять код так, как ему нравится, без необходимости проходить всю базу данных для корректировки ссылок. База данных имеет только одну цель: облегчить нескольким пользователям поддержку данных XML, которые использует другое приложение. У нас есть около 5 человек, которые вносят изменения в эти данные около 24/7, и экспортный XML генерируется примерно раз в неделю, который затем отправляется нашим клиентам. (Те, кто в основном используют эти данные в автономном приложении, на ноутбуках с ограниченным подключением к Интернету.)

Ответы [ 2 ]

0 голосов
/ 15 июня 2009

Нашли это! Однако это неприятно, поскольку в нем участвовало редактирование самой модели сущностей. Сначала щелкните правой кнопкой мыши модель сущности и выберите «Открыть с помощью», чтобы открыть файл с помощью редактора XML. Затем перейдите к тегу и посмотрите под ним, чтобы найти узел, имя которого совпадает с именем дочерней таблицы. («Компонент» в моем случае. Это выглядит так:

<EntityType Name="Component">
  <Key>
    <PropertyRef Name="Identity" />
  </Key>
  <Property Name="Identity" Type="Int32" Nullable="false" />
  <Property Name="Code" Type="String" Nullable="false" />
  <Property Name="Naam" Type="String" Nullable="false" />
  <Property Name="Omschrijving" Type="String" Nullable="true" />
  <NavigationProperty Name="Context" Relationship="Content_Model.FK_Component Context" FromRole="Component" ToRole="Context" />
</EntityType>

Как вы заметили, он ставит «Код» перед «Имя». Переключите эти две строки, и вы получите это:

<EntityType Name="Component">
  <Key>
    <PropertyRef Name="Identity" />
  </Key>
  <Property Name="Identity" Type="Int32" Nullable="false" />
  <Property Name="Naam" Type="String" Nullable="false" />
  <Property Name="Code" Type="String" Nullable="false" />
  <Property Name="Omschrijving" Type="String" Nullable="true" />
  <NavigationProperty Name="Context" Relationship="Content_Model.FK_Component Context" FromRole="Component" ToRole="Context" />
</EntityType>

Поскольку «Код» и «Имя» имеют индекс, DDS просто выберет первый, который обнаружит в этом разделе. Так как я сначала поставил «Имя», теперь он становится текстом в ссылке.

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

0 голосов
/ 15 июня 2009

Рассмотрите возможность пересмотра вашей модели данных.

Я бы удалил столбец имени и кода из таблицы компонентов и добавил столбец Identity из контекстной таблицы, переименовав его в обеих таблицах в ContextIdentity.

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

Я подозреваю, что оно использует поле кода, поскольку оно самое короткое и, следовательно, наиболее эффективное.

...