8

VS2012 とエンティティ デザイナーを使用して、データベースとモデルの両方を生成しています。Table1 から Table1and2JoinTable から Table2 への非常に基本的なシナリオがあります。学生、クラス、学生クラスのようなもの。多くのクラスに多くの生徒を含めることができます。カスケード削除をしたいと思います。したがって、学生を削除すると、その学生 ID の StudentClass 結合テーブル内のすべての行が削除されます。クラスを削除する場合も同様で、そのクラス ID の StudentClass 内のすべての行が削除されます。デザイナーで多対多の関連付けを設定し、カスケード削除オプションを設定した後、データベースを生成しようとすると、次のエラーが発生します。

エラー 132: 関係 'Model1.StudentClass' の終了 'Student' は、その多重度が ' ' であるため、操作を指定できません。多重度 ' ' の端には操作を指定できません

以下に小さな例を示します。

デザイナー

作成された関連付けは次のとおりです。

ここに画像の説明を入力

結果のエラーメッセージは次のとおりです。

ここに画像の説明を入力

データベース テーブルを生成するための SQL コードの一部を次に示します。

-- Creating foreign key on [Students_Id] in table 'StudentClass'
ALTER TABLE [dbo].[StudentClass]
ADD CONSTRAINT [FK_StudentClass_Student]
    FOREIGN KEY ([Students_Id])
    REFERENCES [dbo].[Students]
        ([Id])
    ON DELETE NO ACTION ON UPDATE NO ACTION;
-- This should be ON DELETE CASCADE ON UPDATE NO ACTION;
GO

-- Creating foreign key on [Classes_Id] in table 'StudentClass'
ALTER TABLE [dbo].[StudentClass]
ADD CONSTRAINT [FK_StudentClass_Class]
    FOREIGN KEY ([Classes_Id])
    REFERENCES [dbo].[Classes]
        ([Id])
    ON DELETE NO ACTION ON UPDATE NO ACTION;
-- This should be ON DELETE CASCADE ON UPDATE NO ACTION;
GO

データベース スクリプトを編集して on delete cascade オプションを追加するだけで、これを回避する方法を知っています。しかし、プロジェクトが大きくなるにつれて何度もデザイナーに戻ってくるので、毎回このステップを覚える必要がないので、これはしたくありません。

誰もこれを解決する方法を考え出しましたか?

4

2 に答える 2

4

edmx の制限のようですが、よくわかりません。Code-first は、2 つのカスケード ON DELETE 制約を持つジャンクション テーブルを完全に生成できますが、model-first と database-first は edmx で同じ構成を許可しません。通常、カスケード アクションは関連付けの「一方」側で構成されます。' ' 端でのカスケード アクションの有効性をチェックするのは複雑すぎる可能性があり*ます (両方の端が ' *' の場合のみ)。

edmx モデルに基づくコンテキストでカスケード削除を行うには、親その子を読み込んでから親を削除する必要があります。

var cls = db.Classes.Include(c => c.Students).Single(c => c.Id = 1);
db.Classes.Remove(cls);
db.SaveChanges();

実行された SQL ステートメントは、が を含むステートメントでClassデータベースからフェッチされたことを示しています。次に、s と theがそれぞれ削除されます。JOINStudentStudentClassClass

明らかに、これはデータベースでカスケード削除を有効にするよりもはるかにコストがかかります。

もちろん、DDL が生成されるたびに DDL を変更するという回避策は魅力的ではありません。StudentClassしかし、唯一の代替手段は、モデルの一部を作成し、新しい関連付けの「一方」の端でカスケード削除を構成することだと思います。または、コードファーストに進みます。

于 2013-12-22T10:52:08.350 に答える