在我的ASP.NET Web应用程序中,我正在尝试实现导入/导出过程以在应用程序DB中保存或插入数据。我的程序会生成一些CSV文件:每个表一个。
显然,其中一些表之间存在关联,当我在数据库中导入CSV时,我想维护行之间的关联。
假设我Table1
和Table2
Table2
有Table1
的外键。所以我可以在Table1
中加ID = 100
加一行,Table2
加Table1_ID = 100
一行。
当我导入带有Table1
数据的CSV时,会为Table1
行生成新ID,当导入相应的CSV文件时,如何在Table2
中保持外键的一致性?
我正在使用Linq-to-SQL从数据库中检索数据...使用DataSet
和DataTable
可以帮助我吗?
注意我想允许累积导入,因此当我导入CSV文件时,数据库中可能已存在数据。所以我不能使用'Set Identity OFF'。
答案 0 :(得分:0)
您可以使用GUID代替整数键。
答案 1 :(得分:0)
首先添加Table1的项目,因此当您添加Table2的项目时,数据库中已存在Table1的相应记录。对于更多表格,您将了解订单。如果要创建任意数据库模式的系统,则需要在内存中创建一个表格图(其中每个节点都是一个表,每个弧都是外键)[基本库中没有类型]然后将其转换为树,以便通过遍历树(广度优先)获得正确的顺序。
您可以让数据库处理存在违反外键的情况,因为没有此类字段。您必须决定是否进行整个导入操作或每个项目的交易。
虽然可以预先分析CSV。为此,您需要存储每个表的主键的值[使用一个集合](再次以正确的顺序迭代表),然后当您正在读取具有外部表的表时您已经阅读过的表的关键字可以检查密钥是否存在,它也可以帮助您检测任何可能的重复。 [如果您已将数据库中的内容考虑在内,则必须进行查询...但是,请注意数据库是否处于活动系统中,在您仍在决定是否可以添加没有问题的CSV]。
要解决您在添加...时生成新ID的问题。
我能想到的最简单的解决方案是:不要。特别是如果它是一个活动系统,正在处理其他请求,因为那时就没有办法预先预测新的ID。您最好的选择是逐个添加它们,在这种情况下,您将不得不认为您的交易策略是......您可能无法回滚。
虽然,我认为您的问题更深一些:如果Table1的ID确实发生了变化,那么如何更新Table2中的相应记录,以便它们指向Table1中的正确记录?
要做到这一点,我想建议按照上面的描述进行分析,然后你将拥有一组可用作索引的集合。这将帮助您在Table2中找到Table1中为每个ID更新的记录。 [如果您已经更新了记录,那么跟踪记录也很重要,并且不要两次,因为生成的ID可能会匹配尚未发送到数据库的ID]。
要回滚,您还可以使用这些集合,因为如果您想要中止操作,它们最终将拥有标识您必须从数据库中提取的记录的新ID。
编辑:那些集合(我建议使用hashset)只有故事,因为它们只有主键(对于intance:表1中的ID)。您将需要行李以保留外键(在本例中为表1中的Table1_ID)。