Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.Net SQL server中实现父子对象_C#_Asp.net_.net_Sql - Fatal编程技术网

C# 在.Net SQL server中实现父子对象

C# 在.Net SQL server中实现父子对象,c#,asp.net,.net,sql,C#,Asp.net,.net,Sql,我开发了一个带有时间表对象的web应用程序。对象的属性为列表。在SQL Server中,这反映在时间表和时间表这两个表中,时间表有一个外键指向时间表表的PK(Id自动编号)。 当前,时间表对象显示在网格上,用户在其中插入和修改条目并最终保存 在保存时间表时,我删除所有时间表条目,然后重新创建它们。当然,每次用户保存时间表时,都会将时间表的“自动编号”字段向上推 这是实现这一目标的最佳方式吗?有更好的方法吗?您应该更新时间表条目,而不是删除,然后重新创建所有条目。使用您的主键,很容易知道哪些需要更

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

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


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

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


此外,您可以通过使用like或EXFORCE来自动执行许多操作。

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


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

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

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

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

编辑

回应用户的评论

对于PK和FK,您仍将使用自动编号,但您应该将其与唯一标识大对象的方法相结合,通常是位于对象图顶部的对象

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

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

考虑下面的例子

CREATE TABLE OrderTypes
(
  Id INT IDENTITY(1,1) PRIMARY KEY,
  Name varchar(100),
  Alias varchar(30),
  Active bit,
  ...
)
现在我不想按Id查找
OrderType
,因为如果我必须从头开始重建数据库,这种情况可能会改变

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

别名概念允许我为每种订单类型指定一个短名称,该名称不可从任何管理屏幕中编辑

继续
OrderType
示例,我可能会给采购订单一个别名“
purchaseorder
”,给销售订单一个别名“
saleorder

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

SELECT * FROM OrderTypes WHERE Alias = 'salesorder'
此时,查询具有自动生成的ID,因此可以基于该值进行进一步查询

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

对于自动生成的ID,这是一种比硬编码好得多的方法。

因此,您建议不要将自动编号用作FK和PK?谢谢;我的看法是,我可能必须插入新条目(不是时间表的一部分,但已插入),删除不再是时间表一部分的条目,并最终更新已更改的条目…这对数据访问层来说是不是太多工作了,这样的操作应该放在您的业务层而不是DA层…您的建议非常有趣…我的印象是BLL应该只关心Timesheet.Save()类型的操作。然后,它将调用较低层(如服务层或数据访问层)中的方法来协调这些DB操作。。。。