1

好的,所以我有这样的结构(不知道如何正确格式化,但我会尝试):

  • 位置,包含id, nameaddress
  • Table Room,其中包含id, name, size一个位置的外键。
  • Table RoomItem(想想桌子、椅子等),包含id, name, type, value房间的外键。

因此,假设我使用这种结构设置了一个包含十几个房间和一百个房间项目的位置。现在我想创建一个新位置,但我想拥有完全相同的房间和房间项目作为新位置的模板。所以基本上我想复制所有指向某个位置的房间并将它们的 FK 更改为新位置,以及复制所有指向所述房间的房间项,并将它们的 FK 更改为指向新创建的房间。

我使用的是 Entity Framework 4.3,但是任何可以从标准 c#winforms 项目中执行的东西都可以正常工作。

我的问题是弄清楚如何“正确”地做到这一点。手动完成这一切似乎很麻烦,这意味着像逐个浏览房间,复制所有字段并创建一个新字段,然后深入研究其房间项并复制它们,然后保存第一个房间,这样我就有了身份证可用。

即使把它写出来听起来也很混乱,那么有没有更好的方法来完成这个?

4

1 回答 1

0

我在下面提供了一种在 SQL 中执行此操作的方法。请注意,此答案受以下警告的约束:

我在没有任何开发工具或参考资料的情况下回答。这意味着答案来自我的记忆。

特别是这意味着解决方案尚未编译;它的语法和语义也可能在某些方面有所偏差。

我使用了我最了解的 sql 变体——用于 Firebird。您需要的确切语法可能因您可用的 sql 而异。

此外,我假设变量名称足以自我解释,无需进一步评论。

最后,这个答案可能会得到改进 - SELECT 语句的重复向我表明,有一种改进可以消除这种重复。

SET TERM !! ;

CREATE TRIGGER Deep_Copy_Room FOR Location
BEFORE INSERT
POSITION 0

AS BEGIN

NEW.id = GEN_ID (id_GEN, 1);
INSERT INTO Room (id, name, size, fk) 
       VALUES (GEN_ID(id_GEN, 1), Roo_name, Roo_Size, NEW.id) 
       WHERE SELECT id, name, size, FK_id FROM Room AS Roo_Id, Roo_name, Roo_size
               WHERE SELECT id, name, addrss FROM Location AS Loc_Id, Loc_name, Loc_address
                       WHERE fk = Copy_From_id;
INSERT INTO Item (id, name, type, value, fk_id) 
       VALUES (GEN_ID(id_GEN,1), Ite_name, Ite_type, Ite_value, Roo_id)
       WHERE SELECT id, name, type, value, FK_id FROM RoomItem AS Ite_Id, Ite_name, Ite_type, Ite_value, Roo_Id)
               WHERE SELECT id, name, size, FK_id FROM Room AS Roo_Id, Roo_name, Roo_size, Loc_id
                       WHERE SELECT id, name, address FROM Location AS Loc_Id, Loc_name, Loc_address
                               WHERE Loc_id = Copy_From_id;

END

SET TERM ; !!
于 2012-08-16T07:27:26.603 回答