2009-06-15 7 views
0

I ont deux tables:Entités et du site de données dynamiques: les références entre les tables

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]) ; 

(Au-dessus de script doit créer à la fois.) Fondamentalement, j'ai une table de composants qui fait référence à la table de contexte.

J'ai créé un site de données dynamique en utilisant les deux tables et .NET prendra soin des références pour moi. C'est un bon moyen de fournir rapidement un site Web de base afin que nous puissions continuer à travailler sur la logique métier en premier.

Cependant, quand je regarde la table des composantes de la DDS, je remarque que la référence indique le code champ du contexte, pas le champ Nom . Alors, comment puis-je forcer le DDS à utiliser le champ Nom à la place lors de l'affichage du lien de référence à la table de contexte?

(de préférence en utilisant quelque chose de simple, puisque je traite plus de 60 tableaux qui sont semblables à celui-ci. La plupart d'entre eux de simples tables de recherche pour rendre le filtrage plus facile.)

Puisque nous n'allons pas Travailler sur le côté GUI de cette application Web pendant quelques mois, ce n'est pas une option pour modifier quelque chose dans la source DDS elle-même. Si cela peut être corrigé dans la base de données ou dans le modèle Entity, merci de me le faire savoir!


Le modèle de données que j'utilise pour ce projet est simple: chaque table a une clé primaire « d'identité » qui est un champ autoIncrement. Les champs Code et Naam (nom) décrivent des données spécifiques et sont utilisés dans d'autres applications pour remplir des comboboxes et des filtres. Ces applications ne communiquent pas directement avec la base de données, mais utilisent un fichier XML d'exportation basé sur la base de données. Dans cet export XML, les liens vers "Identity" sont remplacés par des liens vers "Code". Cela permet à l'utilisateur de changer le code à tout ce qu'il veut sans avoir besoin de parcourir toute la base de données pour ajuster les références. La base de données n'a qu'un seul but: permettre à plusieurs utilisateurs de gérer plus facilement les données XML utilisées par une autre application. Nous avons environ 5 personnes qui apportent des modifications à ces données environ 24/7 et un XML d'exportation est généré environ une fois par semaine, qui est ensuite envoyé à nos clients. (Qui utilisent principalement ces données dans une application hors ligne, sur des ordinateurs portables avec une connectivité Internet limitée.)

+0

Traduction pour les curieux: Naam = Nom, Omschrijving = Commentaire. Le reste ne sont que des noms anglais. Alors maintenant vous connaissez la traduction néerlandaise de deux mots anglais. :-) –

Répondre

0

Trouvé! C'est méchant, cependant, car cela impliquait d'éditer le modèle d'entité lui-même. Tout d'abord, cliquez avec le bouton droit sur le modèle d'entité et sélectionnez "Ouvrir avec" pour ouvrir le fichier à l'aide de l'éditeur XML. Ensuite, allez à la balise et regardez en dessous pour rechercher un nœud dont le nom est celui de la table enfant. . (« Component » dans mon cas, il ressemble à ceci:

<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> 

Comme vous le remarquez, il met « Code » avant « Nom ».Mettez ces deux lignes et vous obtiendrez ceci:

<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> 

Parce que les deux « Code » et « Nom » ont un indice, la DDS suffit de sélectionner le premier qu'il découvre dans cette section. Comme je viens de mettre "Nom" en premier, il devient le texte de la référence.

Fondamentalement, une vraie solution facile, mais il a fallu un certain temps pour découvrir ...

0

Envisagez de réviser votre modèle de données.

Je supprime la colonne de nom et de code de la table Component et ajoute la colonne Identity de la table de contexte, la renommant dans les deux tables en tant que ContextIdentity.

Comme votre modèle est maintenant. Il y a 2 liens valides entre les tables, ce qui entraîne une utilisation inefficace du stockage et de la vérification des validaions.

Je suppose qu'il utilise le champ de code car c'est le plus court, et donc le plus efficace.

+0

En fait, non. La seule relation entre ces deux tables est Component.ContextLink -> Context.Identity. Les deux tables contiennent des champs très similaires. –

Questions connexes