問題タブ [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.
entity-framework - Entity Framework でオブジェクトとそのすべての子オブジェクトを削除しますか?
ここでこの質問に対する答えを見つけようとしています。何人かが同じようなことを尋ねているようですが、私には答えがありません。一連の子エンティティ (1 対多の関係) を持つ EF エンティティがあります。「親」エンティティを削除し、すべての子エンティティを同時に削除できるようにしたい。
一部の人々は、EFモデルとデータベース(私の場合はSql Server)の両方で「Cascade Delete」を設定する必要があると述べています。問題は:
- これを行う方法がまったくわかりません(知っておくべき回答に暗示されているようですが、申し訳ありません...)
- 以前に同様の問題に遭遇したことがあり、このカスケード削除を設定するよりも簡単な答えを見つけた気がします。私が間違っているかもしれませんが、それが唯一の方法かもしれませんが、もっと簡単な解決策があれば知りたいです。
どちらの場合でも、これを機能させる方法の明確な例をいただければ幸いです。
sql-server - SQL Server 2008 - 複数のカスケード FK - トリガーは必要ですか?
UserとPostの間に 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 があります)。
では、両方のキーをカスケードすることはできませんか? 役立つもの(およびユーザーを参照する他のテーブル)を手動で削除するには、「ユーザー」(削除後)にトリガーが必要ですか。
mysql - データベースの保存を手伝ってください
最近、データベースを別のサーバーに移行しました。
古いサーバーでは、InnoDB の ON DELETE CASCADE ルールを多用しました。
新しいサーバーでは、MySql に InnoDB エンジンが設定されていませんでした。
移行の時点で、新しいサーバーは MyISAM にデフォルト設定されていましたが、私は今までこれに気づきませんでした。(頭を壁にぶつけて!)
状況は次のとおりです。データベースが使用されているため、ON DELETE CASCADE ルールを使用していたテーブルの一部が同期しなくなりました。(まだ頭を壁にぶつけている。)
つまり、テーブルを InnoDB に変更してカスケード ルールを再適用することはできません。キーの一部は、存在しなくなった行を参照するようになりました。
私の質問はこれです:
挿入されている行のいずれかがカスケード規則に違反している場合、その行を黙って無視して次の行に移動するように INSERT ステートメントを構成する方法はありますか? (最初は、INSERT IGNORE でこれを達成できると思っていましたが、試してみましたが、うまくいかないようです。)
よろしくお願いいたします。
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
ても問題は解決しません。
mysql - MySQL MyISAM ストレージ エンジンでカスケード削除を使用するには?
私はEquipment と呼んだ 1 つのテーブルと、 equipment_child1と呼んだ他の 8 つのテーブルを持っています。
そのすべてのテーブル間の共通フィールドはcod_equip です。このフィールドを使用すると、すべての子機器テーブルを機器の親テーブルで識別できます。
機器を移動するときに機器からデータを削除する必要がありますが、すべてのテーブルの機器_子1から機器_子8のデータを削除する必要があります。
それから私は innoDB エンジンでDELETE CASCADEを使用したことを覚えていますが、今は MyISAM エンジンを使用しています。それは問題ですか?
どんな助けでも、本当に明確になります...
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 に設定する方がよいでしょうか? それとも、私は夢中になっていて、要点を完全に見逃していますか?
entity-framework - 外部キーを公開せずに、EFコードファーストでカスケード削除を有効にする
外部キーを公開せずに1対多の関係の削除を実行すると、EFは親レコードを削除し、子レコードの外部キーをnullにしようとします。もちろん、外部キーはnull許容ではないため、これによりエラーが発生します。子クラスに外部キーを追加すると、この動作がオーバーライドされますが、公開したくありません。
たとえば、次の2つのクラスがある場合、ProjectクラスのプロパティとしてJobIdを使用したくないと思います。
関係の多くの側で外部キーを公開せずに、EFコードファーストでカスケード削除を有効にする方法はありますか?
ef-code-first - EF 4.1 RC:奇妙なカスケード削除
確かに、EF 4.1 RC Codefirst、DataAnnotations、FluentAPIの機能はまだ私には圧倒されています。時々私は自分が何をしているのか本当にわからない;-)次のPOCOを見てください:
一般的な考え方:すべての国が通貨を持っている必要があります。ただし、通貨を国に割り当てる必要はまったくありません。
EFに対応するデータベースを作成させると、慣例により、関係はCASCADEDELETEに設定されます。つまり、通貨を削除すると、対応する国も削除されます。しかし、私の場合、これは私が望むものではありません。
CASCADE DELETEを無効にするために、FluentAPIでいくつかのコードを思いつきました。
私はこれが意味すると思いました:すべての国は通貨を必要とします。また、この通貨には0、1つ以上の国が割り当てられている場合があります(オプション)。また、通貨を削除するたびに、対応する国(存在する場合)はカスケード削除されません。
驚いたことに、対応する通貨を削除した場合でも、指定されたアプローチで国をカスケード削除します。誰かが私が恋しいものを教えてもらえますか?
entity-framework - Entity Framework を使用したカスケード削除 - EF によって削除された関連エンティティ
Entity Framework での削除に問題があります。つまり、データベースでカスケード削除を使用するように EF を明示的に構成したにもかかわらず、EF は明示的にデータベースからエンティティを削除しようとします。
私のデザイン:
MainEntity
、およびの 3 つのエンティティ タイプがEntityTypeA
ありEntityTypeB
ます。EntityTypeA
EF は、 および を削除するときにカスケード削除を使用するように構成されていますEntityTypeB
。つまり、 のインスタンスを削除するとMainEntity
、関連するEntityTypeA
およびEntityTypeB
インスタンスもすべて削除されます。親を削除せずに、EntityTypeA
または削除することはありません。EntityTypeB
私の問題は、EF が に対して明示的にDELETE
ステートメントを発行しEntityTypeA
、アプリケーションがクラッシュすることです。
これは私のモデルがどのように見えるかです:
リレーションには、次のデフォルト以外の構成があります。
MainEntity -> EntityTypeA OnDelete: Cascade
MainEntity -> EntityTypeB OnDelete: Cascade
関係EntityTypeA -> EntityTypeB
はOnDelete: None
データベースの内容
私のコード:
何が起こるのですか
SaveChanges を呼び出すと、Entity Framework はデータベースで次の処理を実行します。
EntityTypeB のテーブルに EntityTypeA インスタンスを参照する項目があるため、これにより外部キー違反が発生します。
質問
カスケード削除を使用するように Entity Framework を構成したにもかかわらず、Entity Framework が EntityTypeA のインスタンスに対して明示的な削除を発行するのはなぜですか? Include("EntityTypeA") を削除すると、再び機能し始めます。