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 中的 Component 表时,我注意到该引用显示了上下文的代码字段,而不是Name字段。那么,在显示上下文表的引用链接时,如何强制 DDS 使用名称字段?

(最好使用简单的方法,因为我正在处理 60 多个与此类似的表。其中大多数是简单的查找表,以使过滤更容易。)

由于我们在几个月内不会在此 Web 应用程序的 GUI 端工作,因此无法更改 DDS 源本身中的某些内容。如果可以在数据库或实体模型中修复,请告诉我!


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

4

2 回答 2

0

考虑修改您的数据模型。

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

就像你现在的模型一样。表之间有 2 个有效链接,这会导致不必要地使用存储和验证检查。

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

于 2009-06-15T11:57:27.373 回答
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 将只选择它在本节中发现的第一个。由于我刚刚将“名称”放在首位,它现在成为参考中的文本。

基本上,一个真正简单的修复,虽然它需要一些时间来发现......

于 2009-06-15T12:53:50.483 回答