1

さて、私はこのような構造を持っています(これを適切にフォーマットする方法はわかりませんが、試してみます):

  • テーブルの場所、には、が含まれid, nameますaddress
  • テーブルルームid, name, size。場所への外部キーが含まれています。
  • テーブルRoomItem(テーブル、椅子などを考えてください)にはid, name, type, value、部屋への外部キーが含まれています。

したがって、この構造を使用して、12の部屋と100の部屋アイテムがある場所を設定したとします。ここで、新しい場所を作成したいのですが、新しい場所のテンプレートとまったく同じ部屋と部屋アイテムが必要です。したがって、基本的には、特定の場所を指すすべての部屋をコピーしてFKを新しい場所に変更し、その部屋を指すすべての部屋アイテムをコピーして、新しく作成された部屋を指すようにFKを変更します。

Entity Framework 4.3を使用していますが、標準のc#winformsプロジェクトから実行可能なものであればすべて問題なく動作します。

そして私の問題は、これを「適切に」行う方法を見つけることです。すべてを手動で行うのは非常に面倒なようです。つまり、部屋を1つずつ確認し、すべてのフィールドをコピーして新しいフィールドを作成し、最初の部屋を保存した後、部屋のアイテムを深く掘り下げてコピーするようなものです。利用可能なID。

これを書き出すことでさえかなり混乱しているように聞こえますが、これを達成するためのより良い方法はありますか?

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 に答える