我有两张桌子:
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]) ;
(上面的脚本应该创建两者。) 基本上,我有一个引用Context表的Component表。
我使用两个表创建了一个动态数据站点,.NET将为我处理引用。这是快速提供一些基本网站的好方法,因此我们可以继续首先处理业务逻辑。
但是,当我查看DDS中的Component表时,我注意到该引用显示了上下文的 code 字段,而不是 Name 字段。那么,在显示上下文表的引用链接时,如何强制DDS使用Name字段?
(最好使用简单的东西,因为我正在处理超过60个与此类似的表。大多数简单的查找表使过滤更容易。)
由于我们几个月不打算在这个Web应用程序的GUI端工作,所以在DDS源本身中改变某些东西是没有选择的。如果可以在数据库或实体模型中修复,请告诉我!
我用于此项目的数据模型很简单:每个表都有一个主键“Identity”,它是一个autoIncrement字段。 Code和Naam(name)字段用于描述特定数据,并在其他应用程序中用于填充组合框和过滤器。这些应用程序不直接与数据库通信,但它们使用基于数据库的导出XML。在此导出XML中,“Identity”链接被“Code”链接所取代。这允许用户将代码更改为他们喜欢的任何代码,而无需遍历整个数据库来调整引用。 该数据库只有一个目的:使多个用户更容易维护另一个应用程序使用的XML数据。我们有大约5个人对这些数据进行了大约24/7的修改,并且每周大约生成一次导出XML,然后将其发送给我们的客户。 (谁主要在离线应用程序中使用此数据,在具有有限互联网连接的笔记本电脑上。)
答案 0 :(得分:0)
考虑修改您的数据模型。
我将从Component表中删除名称和代码列,并从上下文表中添加Identity列,并在两个表中将其重命名为ContextIdentity。
正如你的模特现在。表之间有2个有效链接,这会导致无需使用存储和验证。
我怀疑它正在使用代码字段,因为这是最短的,因此效率最高。
答案 1 :(得分:0)
<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>
因为“Code”和“Name”都有索引,所以DDS只会选择它在本节中发现的第一个索引。由于我刚刚将“名称”放在首位,现在它变成了引用中的文本。
基本上,这是一个非常简单的解决方案,虽然花了一些时间才发现......