【发布时间】:2012-09-22 22:58:00
【问题描述】:
我正在尝试找出使用 .NET 数据集的正确方法。您是否应该为数据库中的每个表创建一个 DataTable 并在 DataSet 中创建关系?在 DataSet 中重建整个数据库结构对我来说似乎很疯狂。
我将使用我的数据库的简化示例。
假设我有一个CompanyEquipment 表。每台设备都属于一个成本中心,成本中心数据存储在CostCenter表中,并与CompanyEquipment表相关联。假设我有一个存储过程,它返回已与CostCenter 表连接的CompanyEquipment 数据,以在一个查询中返回所有信息。我可以使用存储过程来填充DataTable,但是如何将这个非规范化的结果表保存回数据库?我不知道这是否是一个好方法。我认为查询使用关联(桥)表的多对多关系将需要多个查询。例如,我有一个 EquipmentRole 表,用于存储不同的设备使用情况,还有一个 EquipmentRoleAssignment 表,其中可以为设备分配多个角色。
或者,如果我有模仿数据库的 DataTables,我必须在每个表上使用 DataAdapter.Fill() 分别查询每个表,以将相关数据放入每个 DataTable。所以我会有类似select * from CompanyEquipment where equipID = 1234 的东西,我会用它和适配器一起填充CompanyEquipment DataTable,然后我必须使用另一个查询select * from CostCenter where costCenterID = <costcenterID from the companyequipment record> 并填充CostCenter DataTable。使用这种方法,我必须访问数据库两次,并且我失去了 DBMS 执行连接的能力。
我是数据驱动应用程序的新手,所以我不熟悉工作流程;特别是我应该访问数据库多少次才能获得一种数据表示。任何帮助表示赞赏。我正在使用 C#。
【问题讨论】:
-
最好先创建一些类来表示您的数据,因为您希望在应用程序中使用它。依赖 DataTable 和 DataSet 确实会将您锁定在数据库的结构中,最终您会失去灵活性。此外,某些内置结构(尤其是 DataSet)在涉及序列化和/或缓存的任务时会带来额外的问题。
-
感谢您的意见。我实际上开始构建自己的类来以面向对象的方式表示数据。我什至开始构建自己的映射类,然后遇到了诸如将多对多关系映射为另一种域类型中的一种域类型的列表以及处理空值等问题。持久化这些对象带来了许多其他设计问题,然后我意识到我正在自己构建一个 ORM,这很愚蠢,因为我永远不会让这个应用程序在下个世纪工作。
-
可以转成社区wiki吗?