エンティティと動的データサイト:表間の参照
-
13-09-2019 - |
質問
私には2つのテーブルがあります:
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の両方を使用して動的なデータサイトを作成しました。基本的なWebサイトをすばやく提供するための良い方法であるため、最初にビジネスロジックに取り組み続けることができます。
ただし、DDSのコンポーネントテーブルを見ると、参照が コード コンテキストのフィールドではなく 名前 分野。それでは、コンテキストテーブルへの参照リンクを表示するときに、代わりにDDSに名前フィールドを使用させるにはどうすればよいですか?
(できれば、これに似た60を超えるテーブルを扱っているので、シンプルなものを使用することができます。それらのほとんどは、フィルタリングを簡単にするための簡単なルックアップテーブルです。)
数か月間、このWebアプリケーションのGUI側で作業するつもりはないため、DDSソース自体の何かを変更する選択肢はありません。データベースまたはエンティティモデルで修正できる場合は、お知らせください!
私がこのプロジェクトに使用するデータモデルは簡単です。すべてのテーブルには、自動挿入フィールドである主要なキー「アイデンティティ」があります。コードとNAAM(名前)フィールドは特定のデータを記述するためであり、他のアプリケーションで使用されてコンボボックスとフィルターを埋めます。これらのアプリケーションはデータベースと直接通信しませんが、データベースに基づいてエクスポートXMLを使用します。このエクスポートXMLでは、「ID」へのリンクが「コード」へのリンクに置き換えられます。これにより、ユーザーは、参照を調整するためにデータベース全体を通過する必要なく、好きなものにコードを変更できます。データベースには1つの目的しかありません。いくつかのユーザーが別のアプリケーションが使用するXMLデータを維持しやすくすることです。約24時間年中無休でこのデータを修正する約5人がいて、XMLのエクスポートが週に約1回生成され、顧客に送信されます。 (主にこのデータをオフラインアプリケーションで使用し、インターネット接続が限られているラップトップで。)
解決 2
それを見つけた!ただし、エンティティモデル自体の編集が含まれているため、厄介です。まず、エンティティモデルを右クリックし、「with with」を選択して、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>
ご存知のように、「名前」の前に「コード」を置きます。これらの2行を切り替えると、これを取得します。
<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はこのセクションで最初に発見したものを選択します。最初に「名前」を入れたばかりなので、参照のテキストになります。
基本的に、本当に簡単な修正ですが、発見するのに時間がかかりました...
他のヒント
データモデルの改訂を検討してください。
コンポーネントテーブルから名前とコード列を削除し、コンテキストテーブルからID列を追加し、両方のテーブルでコンテキストのように名前を変更します。
あなたのモデルが今のように。テーブル間には2つの有効なリンクがあります。これにより、ストレージの不安の使用とvalidaionチェックが発生します。
これは最短であり、したがって最も効率的であるため、コードフィールドを使用していると思います。