好的,我有这样的结构(不知道如何正确格式化,但我会尝试):
id, name
和address
。id, name, size
和某个位置的外键。id, name, type, value
和房间的外键。所以,让我们说我已经建立了一个使用这种结构的十几个房间和一百个房间的位置。现在我想创建一个新位置,但我希望将新房间和房间项目作为新位置的模板。所以基本上我想要复制指向某个位置的所有房间并将他们的FK更改为新位置,以及复制指向所述房间的所有房间项目,并将他们的FK更改为指向新创建的房间。
我正在使用Entity Framework 4.3,但是从标准c#winforms项目执行的任何内容都可以正常工作。
我的问题是弄清楚如何做到这一点"正确"。手动完成这一切似乎很麻烦,这意味着像一个一个地穿过房间,复制他们所有的领域并创建一个新的领域,然后深入到它的roomitems并复制它们,保存第一个房间,所以我有它可用。
即使写出来也听起来很混乱,那么有更好的方法来实现这个目标吗?
答案 0 :(得分: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 ; !!