Сущности и сайт динамических данных:ссылки между таблицами

StackOverflow https://stackoverflow.com/questions/995605

Вопрос

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

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, я замечаю, что ссылка показывает код поле контекста, а не Имя поле.Итак, как мне заставить DDS вместо этого использовать поле «Имя» при отображении ссылки на контекстную таблицу?

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

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


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

Это было полезно?

Решение 2

Нашел!Однако это неприятно, поскольку требует редактирования самой модели объекта.Сначала щелкните правой кнопкой мыши модель объекта и выберите «Открыть с помощью», чтобы открыть файл с помощью редактора 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 просто выберет первый, который обнаружит в этом разделе.Поскольку я только что поставил «Имя» первым, оно теперь становится текстом в ссылке.

В принципе, это очень простое решение, хотя потребовалось некоторое время, чтобы обнаружить...

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top