您实际上只需右键单击该关系并选择Edit Relation... 或双击该行(当鼠标光标从箭头变为拖动符号时),但老实说我不会打扰;然后,您将在任何使用关系的代码中进行进一步的重构,并且视觉设计师可以大量使用它。
您还会遇到 VS 可能无法帮助您进行重构的问题:在数据绑定场景中,大多数可以作为数据源的东西也可以是多个可以是有效 DataSource 的东西的集合。然后他们依靠字符串DataMember 来确定数据源中的哪些数据集合应该用于数据。
例如,当绑定源绑定到列出DataTable 时,bindingsource.DataSource 属性可能是包含DataTable, and thebindingsource.DataMemberis a string of "YOUR_TABLE_NAME". the BindingSource might not be bound asmyBindignSource.DataSource = myDataSet.MyDataTable 的DataSet 对象.重构字符串内部涉及查找和替换
DataSet 中的 DataRelations 是从外键创建的,因为它们是在将相关表添加到数据集中时发现的,但重要的是要注意,与 DataTables 和其他所有内容一样,它们与数据库无关根本没有模式对象 - 它们不会与它们永久关联,数据集实体只是在首次创建它们(数据集实体)时设置为看起来像数据库对象。数据表仅从选定的那些列创建,并且任何 .NET 数据类型都与查询输出的类型非常相似。对于以下表格:
Person
------
Name VARCHAR(50)
SSN INTEGER
Birthdate DATE
如果您使用SELECT * FROM Person 创建表,您将获得带有Name (string), SSN (int), Birthdate (datetime) 的数据表,但如果您在基于SELECT LEFT(Name, 1) as Initial, PADLEFT(SSN, 20) as PadSSN, DATEDIFF(day, Birthdate, NOW()) as AgeDays FROM Person 的数据集中创建一个新数据表,那么您将获得Initial (string), PadSSN (string), AgeDays (int) 的数据表 - 即数据表看起来不像 db 表。数据集和数据库之间的这种断开连接的概念很普遍,实际上与数据库有任何关系的唯一事物是指定特定 DataTable/DataColumn 与哪个数据库表/列相关的属性,以便加载/保存数据。你的Person.Name 数据列可以重命名为Blahblah,但它仍然有一个.SourceColumn 属性设置为"Name"——这就是数据集和数据库之间的映射的工作方式;数据集主要完全独立于数据库。重命名数据库列只需要更改 SourceColumn 属性
DataRelations 甚至没有链接到数据库中的父关系的概念;没有SourceRelation 或SourceFK proeprty,因为没有必要。它们使用相同的规则和生成的名称都基于 FK 的规则进行设置,但随后它们独立运行并且仅在数据集中运行。如果您重命名甚至从数据库中删除 FK,则数据集将继续以与以往相同的受限方式工作;当没有 aprent 行存在时将数据行添加到子表将引发异常 - 这与 db 中的 FK 没有任何关系,并且 DataRelation 可以与 FK 有不同的规则(例如,它可以级联删除当 FK 为 NOACTION 时)甚至不同的列。您可以拥有比数据库拥有的 FK 更多或更少的 DataRelations
运行自定义工具不是“联系数据库,看看那里发生了什么变化并将它们复制到数据集中”,它是“将描述数据集的 XSD 转换为一组实现强类型数据集的 C# 类/table/relation/column 等对象”。每当您通过在可视化设计器中进行编辑并点击保存来更改 XSD 时,都会运行自定义工具。如果您直接在文本编辑器中编辑 XSD,您可能需要手动运行它以使您的更改反映在 c# 类中
重新配置 tableadapter 也可能不会对关系做任何事情;它只关心更改数据表和表适配器。如果您真的想刷新关系,请从集合中删除数据表并重新创建它。为潜在的重大清理/重构代码做好准备