在 .NET Framework 应用程序中创建数据集之间的关系

注释

此类 DataSet 和相关类是 2000 年代初的旧版 .NET Framework 技术,使应用程序能够在应用与数据库断开连接时处理内存中的数据。 这些技术对于使用户能够修改数据并将更改保留回数据库的应用特别有用。 尽管数据集是经过证实的成功技术,但新 .NET 应用程序的建议方法是使用 Entity Framework Core。 Entity Framework 提供了一种更自然的方式来将表格数据用作对象模型,并且具有更简单的编程接口。

包含相关数据表的数据集使用 DataRelation 对象来表示表之间的父/子关系,以及从彼此返回相关记录。 使用 数据源配置向导数据集设计器向数据集添加相关表会为你创建和配置 DataRelation 对象。

DataRelation 对象执行两个函数:

  • 它可以提供与正在使用的记录相关的记录。 如果你在父记录中 (GetChildRows),则它会提供子记录;如果你使用子记录 (GetParentRow),则它会提供父记录。

  • 它可以强制执行引用完整性约束(例如,删除父记录时删除相关的子记录)。

务必了解真正连接与对象DataRelation的函数之间的差异。 在真正的联接中,记录取自父表和子表,并放入单个平面记录集。 使用 DataRelation 对象时,不会创建新的记录集。 相反,DataRelation 会跟踪表之间的关系,并将父记录和子记录保持同步。

DataRelation 对象和约束

DataRelation对象还用于创建并强制实施以下约束:

  • 唯一约束,它保证表中的列不包含重复项。

  • 外键约束,可用于维护数据集中父表和子表之间的引用完整性。

DataRelation对象中指定的约束通过自动创建适当的对象或设置属性来实现。 如果使用对象创建外键约束 DataRelation ,则 ForeignKeyConstraint 类的实例将添加到 DataRelation 对象的 ChildKeyConstraint 属性中。

唯一约束的实现可以通过简单地将数据列的Unique属性设置为true,或者将一个UniqueConstraint类的实例添加到DataRelation对象的ParentKeyConstraint属性。 有关在数据集中暂停约束的信息,请参考 在填充数据集时关闭约束

引用完整性规则

作为外键约束的一部分,可以指定在三点应用的引用完整性规则:

  • 当父记录被更新时

  • 删除父记录时

  • 接受或拒绝更改时

可以制定的规则在Rule枚举中指定,并在下表中列出。

外键约束规则 行动
Cascade 对父记录的更改(更新或删除)也会在子表中的相关记录中得到应用。
SetNull 不会删除子记录,但子记录中的外键设置为 DBNull。 使用此设置,子记录可以保留为“孤立”,也就是说,它们与父记录没有关系。 注意: 使用此规则可能会导致子表中的数据无效。
SetDefault 相关子记录中的外键设置为其默认值(由列 DefaultValue 的属性建立)。
None 不更改相关子记录。 使用此设置,子记录可以包含对无效父记录的引用。

有关数据集表中的更新的详细信息,请参阅 将数据保存回数据库

仅包含约束的关系

创建 DataRelation 对象时,可以选择指定关系仅用于强制约束,也就是说,它也不会用于访问相关记录。 可以使用此选项生成一个稍微更高效且包含的方法比具有相关记录功能的方法少的数据集。 但是,无法访问相关记录。 例如,仅约束关系会阻止删除仍具有子记录的父记录,并且无法通过父记录访问子记录。

在数据集设计器中手动创建数据关系

使用 Visual Studio 中的数据设计工具创建数据表时,如果可以从数据源中收集信息,则会自动创建关系。 如果从工具箱“数据集”选项卡手动添加数据表,则可能需要手动创建关系。 有关以编程方式创建 DataRelation 对象的信息,请参阅 “添加 DataRelations”。

数据表之间的关系在 数据集设计器中显示为线条,其中一个键和无限字形描绘了关系的一对多方面。 默认情况下,关系的名称不会出现在设计图面上。

注释

本文中的说明阐述了 Visual Studio 中可用的最新版本的交互式开发体验 (IDE)。 你的计算机可能会对某些用户界面元素显示不同的名称或位置。 你可能正在使用其他版本的 Visual Studio 或其他环境设置。 有关详细信息,请参阅个性化设置 IDE

在两个数据表之间创建关系

  1. 数据集设计器中打开数据集。 有关详细信息,请参阅 演练:在数据集设计器中创建数据集

  2. DataSet 工具箱中的 Relation 对象拖到关系中的子数据表上。

    打开“关系”对话框,并根据将“关系”对象拖动到其中的表填充“子表”框

  3. “父表 ”框中选择父表。 父表包含一对多关系的“一”端上的记录。

  4. 验证正确的子表是否显示在子表框中。 子表包含一对多关系的“多”端上的记录。

  5. “名称 ”框中键入关系的名称,或根据所选表保留默认名称。 这是代码中实际 DataRelation 对象的名称。

  6. 选择联接“键列”和“外键列”列表中表的列

  7. 选择是创建关系、约束还是同时创建两者。

  8. 选择或清除 “嵌套关系 ”框。 选择此选项会将 Nested 属性 true设置为,当这些行作为 XML 数据写入或同步 XmlDataDocument时,它会导致关系子行嵌套在父列中。 有关详细信息,请参阅 嵌套数据关系

  9. 设置更改这些表中的记录时要强制实施的规则。 有关详细信息,请参阅 Rule

  10. 单击“ 确定 ”以创建关系。 在设计器中,关系线出现在两个表之间。

在数据集设计器中显示关系名称

  1. 数据集设计器中打开数据集。 有关详细信息,请参阅 演练:在数据集设计器中创建数据集

  2. “数据” 菜单中,选择“ 显示关系标签 ”命令以显示关系名称。 清除该命令以隐藏关系名称。