Сущности и сайт динамических данных:ссылки между таблицами
-
13-09-2019 - |
Вопрос
У меня есть две таблицы:
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 действительные ссылки, это приводит к ненужному использованию хранилища и проверке достоверности.
Я подозреваю, что оно использует поле кода, поскольку оно самое короткое и, следовательно, наиболее эффективное.