問題タブ [cascading-deletes]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
4216 参照

entity-framework - Entity Framework でオブジェクトとそのすべての子オブジェクトを削除しますか?

ここでこの質問に対する答えを見つけようとしています。何人かが同じようなことを尋ねているようですが、私には答えがありません。一連の子エンティティ (1 対多の関係) を持つ EF エンティティがあります。「親」エンティティを削除し、すべての子エンティティを同時に削除できるようにしたい。

一部の人々は、EFモデルとデータベース(私の場合はSql Server)の両方で「Cascade Delete」を設定する必要があると述べています。問題は:

  1. これを行う方法がまったくわかりません(知っておくべき回答に暗示されているようですが、申し訳ありません...)
  2. 以前に同様の問題に遭遇したことがあり、このカスケード削除を設定するよりも簡単な答えを見つけた気がします。私が間違っているかもしれませんが、それが唯一の方法かもしれませんが、もっと簡単な解決策があれば知りたいです。

どちらの場合でも、これを機能させる方法の明確な例をいただければ幸いです。

0 投票する
1 に答える
3633 参照

sql-server - SQL Server 2008 - 複数のカスケード FK - トリガーは必要ですか?

UserPostの間に 1..* 関係があります。(1 人のユーザーが複数の投稿を持っている)

Postには「UserId」と呼ばれる FK があり、これはUserテーブルの「UserId」フィールドにマップされます。

この FK を Cascade UPDATE/DELETE として設定しようとしましたが、次のエラーが発生します。

「ユーザー」テーブルは正常に保存されました 「投稿」テーブル - リレーションシップ「FK_Posts_Users」を作成できません。
テーブル 'Posts' に FOREIGN KEY 制約 'FK_Posts_Users' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。制約を作成できませんでした。以前のエラーを参照してください。

PostHelpfulというテーブルがあります。1 つの投稿には多くの役立つ投稿があります。

Helpful には User へのカスケード FK があります (そのため、User が削除されると、その Helpful も削除されます)。

しかし、これが「複数のカスケードパス」に対する不満の原因だと思います。

ユーザーを削除すると(現在)、そのユーザーの役立つ情報が削除されるためです。しかし、ポストにもカスケードを追加しようとしていますが、ポストを削除してから、そのポストのヘルプフルを削除しようとします(ヘルプフルにはポストへのカスケード FK もあるため)。そのシナリオでは、SQL はどのカスケード FK を選択しますか?

問題の 3 つのテーブルのデータベース ダイアグラムを次に示します。

ここに画像の説明を入力

ご覧のとおり、「PostHelpful」は「Post」と「User」の両方の子です (両方に FK があります)。

では、両方のキーをカスケードすることはできませんか? 役立つもの(およびユーザーを参照する他のテーブル)を手動で削除するには、「ユーザー」(削除後)にトリガーが必要ですか。

0 投票する
1 に答える
97 参照

mysql - データベースの保存を手伝ってください

最近、データベースを別のサーバーに移行しました。

古いサーバーでは、InnoDB の ON DELETE CASCADE ルールを多用しました。

新しいサーバーでは、MySql に InnoDB エンジンが設定されていませんでした。

移行の時点で、新しいサーバーは MyISAM にデフォルト設定されていましたが、私は今までこれに気づきませんでした。(頭を壁にぶつけて!)

状況は次のとおりです。データベースが使用されているため、ON DELETE CASCADE ルールを使用していたテーブルの一部が同期しなくなりました。(まだ頭を壁にぶつけている。)

つまり、テーブルを InnoDB に変更してカスケード ルールを再適用することはできません。キーの一部は、存在しなくなった行を参照するようになりました。

私の質問はこれです:

挿入されている行のいずれかがカスケード規則に違反している場合、その行を黙って無視して次の行に移動するように INSERT ステートメントを構成する方法はありますか? (最初は、INSERT IGNORE でこれを達成できると思っていましたが、試してみましたが、うまくいかないようです。)

よろしくお願いいたします。

0 投票する
2 に答える
2261 参照

c# - Hibernate カスケード削除

マッピングを表示することから始めましょう。

親:

子:

つまり、プロファイルには多くの通信チャネルを含めることができます。

UI (ユーザー インターフェイス[ASP.NET Webforms] ) で、次のイベントが発生します (通信チャネルが関連付けられたプロファイルを削除します)。

(DaoFactory は 1 つのプロジェクト ファイルにあり、UI は ASP.NET Web サイトです)

このコードは機能します。

重要:コードは NHibernate の「open-session-in-view」パターンを使用しています。

同じコードを起動するサービスの実装があります (通信チャネルでプロファイルを削除します)。いくつかのコード...

「EndTransaction()」は「コミット」を行います。このコードを「単体テスト」でテストします。

このコードは失敗します。次のエラーが私を悩ませています:

DELETE ステートメントは、REFERENCE 制約 "R2_PROFIEL" と競合しました。データベース「CRM_ontw」、テーブル「dbo.COMMUNICATIEKANAAL」、列「SEK_PROFIEL」で競合が発生しました。ステートメントは終了されました。

これは、カスケードがまったく発生しなかったことを意味します。UIから実行すると機能しますが、「サービスの実装」から実行すると失敗します。私に役立つアイデアや提案はありますか?

前もって感謝します


編集:次の一般的なコードはオブジェクトを削除します

を設定しall-delete-orphanても問題は解決しません。

0 投票する
1 に答える
8032 参照

mysql - MySQL MyISAM ストレージ エンジンでカスケード削除を使用するには?

私はEquipment と呼んだ 1 つのテーブルと、 equipment_child1呼んだ他の 8 つのテーブルを持っています

そのすべてのテーブル間の共通フィールドはcod_equip です。このフィールドを使用すると、すべての子機器テーブルを機器の親テーブルで識別できます。

機器を移動するときに機器からデータを削除する必要がありますが、すべてのテーブルの機器_子1から機器_子8のデータを削除する必要があります。

それから私は innoDB エンジンでDELETE CASCADEを使用したことを覚えていますが、今は MyISAM エンジンを使用しています。それは問題ですか?

どんな助けでも、本当に明確になります...

0 投票する
2 に答える
2344 参照

nhibernate - 双方向の 1 対多 (または多対 1) カスケード削除動作。それは機能しますが、なぜですか?

Category と Product の 2 つのクラスに 2 つの Nhibernate マッピングがあります。私の Category クラスには、コレクションである 2 つのプロパティがあります。Children プロパティは、子カテゴリを表す Category タイプのコレクションです (カテゴリ メニュー、典型的な親子シナリオを表します)。Category クラスの 2 番目のプロパティは、カテゴリの下のすべての製品を表す Products コレクションです。

私が達成しようとしているのは、カテゴリを削除するときに、カテゴリを削除したいが製品は削除したくないということです。だから私は製品を孤立させたいと思っています。つまり、Product テーブルの外部キー (CategoryId) を null に設定します。カテゴリーを削除したからといって商品を削除したくありません。後で別のカテゴリに再割り当てできるようにしたい. 上記のシナリオを表す私のマッピングは以下のとおりです。

このマッピングでは、製品が関連付けられているカテゴリを削除すると、次の制約エラーが発生します。

DELETE ステートメントは、REFERENCE 制約 "fk_Category_Product" と競合しました。データベース「naakud」、テーブル「dbo.Product」、列「CategoryId」で競合が発生しました。ステートメントは終了されました。

ただし、カテゴリ マッピングの Products コレクションの inverse=true 属性を削除すると、正常に機能します。製品テーブルの CategoryId 外部キーが null に設定されているため、製品とカテゴリの関連付けが解除されています。それが私が欲しいものです。

逆属性について読みましたが、それが関係の所有側を意味し、更新/挿入/削除が異なる順序で行われることを理解しています。これが私の問題を解決すると思う理由です. 私の質問は、私は自分の問題を正しい方法で解決していますか? これはパフォーマンスにどのように影響しますか? (あまり疑わない)。パフォーマンスを向上させるには、多対一の関係を持たない一方向の関係を持ち、inverse 属性を true に設定する方がよいでしょうか? それとも、私は夢中になっていて、要点を完全に見逃していますか?

0 投票する
1 に答える
8114 参照

entity-framework - 外部キーを公開せずに、EFコードファーストでカスケード削除を有効にする

外部キーを公開せずに1対多の関係の削除を実行すると、EFは親レコードを削除し、子レコードの外部キーをnullにしようとします。もちろん、外部キーはnull許容ではないため、これによりエラーが発生します。子クラスに外部キーを追加すると、この動作がオーバーライドされますが、公開したくありません。

たとえば、次の2つのクラスがある場合、ProjectクラスのプロパティとしてJobIdを使用したくないと思います。

関係の多くの側で外部キーを公開せずに、EFコードファーストでカスケード削除を有効にする方法はありますか?

0 投票する
1 に答える
3536 参照

ef-code-first - EF 4.1 RC:奇妙なカスケード削除

確かに、EF 4.1 RC Codefirst、DataAnnotations、FluentAPIの機能はまだ私には圧倒されています。時々私は自分が何をしているのか本当にわからない;-)次のPOCOを見てください:

一般的な考え方:すべての国が通貨を持っている必要があります。ただし、通貨を国に割り当てる必要はまったくありません。

EFに対応するデータベースを作成させると、慣例により、関係はCASCADEDELETEに設定されます。つまり、通貨を削除すると、対応する国も削除されます。しかし、私の場合、これは私が望むものではありません。

CASCADE DELETEを無効にするために、FluentAPIでいくつかのコードを思いつきました。

私はこれが意味すると思いました:すべての国は通貨を必要とします。また、この通貨には0、1つ以上の国が割り当てられている場合があります(オプション)。また、通貨を削除するたびに、対応する国(存在する場合)はカスケード削除されません。

驚いたことに、対応する通貨を削除した場合でも、指定されたアプローチで国をカスケード削除します。誰かが私が恋しいものを教えてもらえますか?

0 投票する
2 に答える
36517 参照

entity-framework - Entity Framework を使用したカスケード削除 - EF によって削除された関連エンティティ

Entity Framework での削除に問題があります。つまり、データベースでカスケード削除を使用するように EF を明示的に構成したにもかかわらず、EF は明示的にデータベースからエンティティを削除しようとします。

私のデザイン:

MainEntity、およびの 3 つのエンティティ タイプがEntityTypeAありEntityTypeBます。EntityTypeAEF は、 および を削除するときにカスケード削除を使用するように構成されていますEntityTypeB。つまり、 のインスタンスを削除するとMainEntity、関連するEntityTypeAおよびEntityTypeBインスタンスもすべて削除されます。親を削除せずに、EntityTypeAまたは削除することはありません。EntityTypeB

私の問題は、EF が に対して明示的にDELETEステートメントを発行しEntityTypeA、アプリケーションがクラッシュすることです。

これは私のモデルがどのように見えるかです:

リレーションには、次のデフォルト以外の構成があります。

  • MainEntity -> EntityTypeA OnDelete: Cascade
  • MainEntity -> EntityTypeB OnDelete: Cascade

関係EntityTypeA -> EntityTypeBOnDelete: None

データベースの内容

私のコード:

何が起こるのですか

SaveChanges を呼び出すと、Entity Framework はデータベースで次の処理を実行します。

EntityTypeB のテーブルに EntityTypeA インスタンスを参照する項目があるため、これにより外部キー違反が発生します。

質問

カスケード削除を使用するように Entity Framework を構成したにもかかわらず、Entity Framework が EntityTypeA のインスタンスに対して明示的な削除を発行するのはなぜですか? Include("EntityTypeA") を削除すると、再び機能し始めます。