2009-06-15 54 views
0

之间的引用我有两个表:实体和动态数据网站:表

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使用Name字段呢?

(最好用简单的东西,因为我处理了60桌是与此类似。他们中的大多数简单的查找表,使过滤更容易。)

因为我们不打算在这个Web应用程序的GUI一边工作了几个月,在DDS源本身中无法改变某些东西。如果它可以在数据库或实体模型中修复,那么请让我知道!


我用于这个项目的数据模型很简单:每个表都有一个主键“Identity”,它是一个autoIncrement字段。 Code和Naam(名称)字段用于描述特定数据,并在其他应用程序中用于填充组合框和过滤器。这些应用程序不直接与数据库通信,但它们使用基于数据库的导出XML。在此导出XML中,指向“身份”的链接将替换为指向“代码”的链接。这允许用户将代码更改为他们喜欢的任何内容,而不需要遍历整个数据库来调整引用。 数据库只有一个目的:使多个用户更容易维护其他应用程序使用的XML数据。我们有大约5人每天24小时对这些数据进行修改,每周生成一次导出XML,然后发送给我们的客户。 (谁主要在离线应用程序中使用此数据,以及具有有限互联网连接的笔记本电脑。)

+0

翻译为好奇:纳摩=名称,Omschrijving =评论。其余的只是英文名字。所以现在你知道两个英文单词的荷兰语翻译。 :-) – 2009-06-15 12:55:27

回答

0

找到了!但它很讨厌,因为它涉及编辑实体模型本身。 首先,右键单击实体模型并选择“打开方式”以使用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

考虑修改您的数据模型。

我将从Component表中删除名称和代码列,并从上下文表中添加Identity列,并将它们重命名为ContextIdentity。

现在你的模型。这两个表之间有两个有效的链接,这会导致无法使用存储和验证检查。

我怀疑它使用的是代码字段,因为这是最短的,因此最有效。

+0

其实没有。这两个表之间的唯一关系是Component.ContextLink - > Context.Identity。这两个表恰好包含非常相似的字段。 – 2009-06-15 12:12:08