0

我开发了一个带有时间表对象的 Web 应用程序。该对象具有一个列表作为属性。在 SQL Server 中,这反映在 2 个表中,即 Timesheets 和 TimesheetEntries,其中 TimesheetEntries 具有指向 Timesheets 表的 PK(Id 自动编号)的外键。目前,时间表对象显示在网格上,用户可以在其中插入和修改条目并最终保存它。

在保存时间表时,我删除了所有时间表条目,然后重新创建它们。当然,每次用户保存时间表时,都会将 TimesheetEntries 的自动编号字段向上推。

这是实现这一目标的最佳方式吗?有一个更好的方法吗?

4

3 回答 3

0

您应该更新时间表条目而不是删除,然后重新创建所有条目。使用您的主键,很容易知道哪些需要更新。

此外,您可以通过使用对象关系映射器(例如Entity FrameworkNHibernate )来自动执行很多操作。

于 2012-10-31T10:46:32.073 回答
0

除了一些额外的工作,你做事的方式没有太大的问题。删除和重新创建子对象是一种常见的方法。

不得不说,自动递增的数字被推高实际上并不重要。您的所有时间表条目都应该可以通过相应的时间表外键检索。

您不应该依赖自动生成的数字。ID 字段上升应该没关系。您真正的解决方案是找到一种一致的方法来正确检索它们,而不管代理键可能是什么。

编辑

回应用户的评论。

您仍然会为 PK 和 FK 使用自动编号,但您应该将其与唯一标识大东西的方法结合起来,这通常是对象图顶部的东西。

我通过在我的数据库中包含一个别名列来实现这一点。

这是一个独特的 varchar 约束,它存在于我可能想要显式查找的任何内容上。

考虑以下示例。

CREATE TABLE OrderTypes
(
  Id INT IDENTITY(1,1) PRIMARY KEY,
  Name varchar(100),
  Alias varchar(30),
  Active bit,
  ...
)

现在我不想OrderType按 Id 查找,因为如果我不得不从头开始重建数据库,那可能会改变。

我也不想OrderType按名字查找。如果有人通过 CMS 功能更改订单类型怎么办?

Alias 概念允许我为每个订单类型提供一个短名称,该名称在任何管理屏幕上都无法编辑。

继续这个OrderType例子,我可能给采购订单一个别名“ purchaseorder”和销售订单和别名“ salesorder”。

当我想获取与销售订单相关的 OrderType 行时,我可以使用:-

SELECT * FROM OrderTypes WHERE Alias = 'salesorder'

此时,您的查询具有自动生成的 ID,因此您可以根据该值进行进一步的查询。

SELECT * FROM Orders WHERE OrderTypeId = <that value I just safely derived>

这比对自动生成的 ID 进行硬编码要好得多。

于 2012-10-31T10:48:44.780 回答
0

自动递增标识列的值与您的业务领域无关。它纯粹用于数据结构中的唯一性和逻辑关系。所以,是的,这个字段正在增加是很好的。无论如何,您的关系发生在 TimeSheetEntry 的 FK 和 TimeSheet PK 之间。

与其删除并重新插入这些记录,不如更新它们。我不确定您的需求/业务问题,因此无法进一步评论。

于 2012-10-31T10:47:41.027 回答