C# 实体和动态数据站点:表之间的引用

C# 实体和动态数据站点:表之间的引用,c#,sql-server,entities,dynamic-data-site,C#,Sql Server,Entities,Dynamic Data Site,我有两张桌子: 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 C

我有两张桌子:

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

最好使用一些简单的方法,因为我正在处理60多个与此类似的表。它们中的大多数都是简单的查找表,以简化筛选

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

我在这个项目中使用的数据模型很简单:每个表都有一个主键标识,它是一个自动递增字段。代码和Naam名称字段用于描述特定数据,并在其他应用程序中用于填充组合框和过滤器。这些应用程序不直接与数据库通信,但它们使用基于数据库的导出XML。在这个导出XML中,指向标识的链接将被指向代码的链接替换。这允许用户随意更改代码,而无需遍历整个数据库来调整引用。
数据库只有一个目的:让多个用户更容易维护另一个应用程序使用的XML数据。我们大约有5个人每天24小时对这些数据进行修改,每周生成一次导出XML,然后发送给我们的客户。他们主要在离线应用程序中使用这些数据,在互联网连接有限的笔记本电脑上使用。

考虑修改您的数据模型

我将从组件表中删除name和code列,并从上下文表中添加Identity列,在两个表中将其重命名为ContextIdentity

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


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

找到了!不过,这很糟糕,因为它涉及到编辑实体模型本身。 首先,右键单击实体模型并选择“打开方式”,以使用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将只选择它在本节中发现的第一个索引。因为我刚刚把名字放在第一位,它现在成为引用中的文本


基本上,这是一个非常简单的解决方案,虽然花了一些时间才发现…

事实上,没有。这两个表之间的唯一关系是Component.ContextLink->Context.Identity。这两个表恰好包含非常相似的字段。其余的只是英文名字。现在你知道两个英语单词的荷兰语翻译了-