3

最初にコードで次のコードを作成しようとしています...始めたばかりなのでできません..助けてください..よろしくお願いします
1.学生:学生には学生ID、名、姓
が必要です1 つのクラスと 1 つのセクション (基本的に各エンティティとの 1 対 1 の関係)
2. クラス: クラスには ClassId があり、名前
クラスには学生のコレクションとセクションのコレクションが必要です (基本的に各エンティティとの多対多の関係)
3. セクション:セクションにはセクションIDがあり、名前
セクションは1つのクラスに属し、学生のコレクションを持つ必要があります(基本的に、クラスとの1対1の関係と学生との1対多の関係)
以下は同じ

学生.cs

public class Students  
{  
    public int StudentsId { get; set; }  
    public string FirstName { get; set; }  
    public string LastName { get; set; }  
    public string UserName { get; set; }  
    public decimal Grade { get; set; }  
    public int ClassesId { get; set; }  
    public Classes Classes { get; set; }  
    public int SectionsId { get; set; }  
    public Sections Sections { get; set; }  
}  

Classes.cs

public class Classes  
{  
    public int ClassesId { get; set; }  
    public string Name { get; set; }  

    public ICollection<Sections> Sections { get; set; }  
}  

Sections.cs

public class Sections
{
    public int SectionsId { get; set; }
    public string Name { get; set; }
    public int ClassesId { get; set; }

    public Classes Classes { get; set; }
    public ICollection<Students> Students { get; set; }
}

これを行うと、次のエラーが表示されます。

テーブル 'Sections' に FOREIGN KEY 制約 'FK_dbo.Sections_dbo.Classes_ClassesId' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。

流暢な API を使用し、削除時にカスケードしないように指示することで、このエラーを取り除くことができることはわかっていますが、そうしたくありません。これに対する他の解決策はありますか?? 助けてください

4

1 に答える 1

1

現在のモデルでは、いいえ、関係の一部に対してカスダディング削除を無効にする以外に方法はありません。

すべての関係が必要です。つまり、クラスが削除されると、そのクラスのセクションと生徒が削除されます (Classesの必須ナビゲーション プロパティにより、生徒のコレクションは公開されませんClasses) Students。ただし、セクションが削除されると、そのセクションの生徒も削除されます。これが への 2 番目の削除パスStudentsです。

モデルの正確な意味はわかりませんが、クラスが削除された場合にクラスのすべての生徒を削除するのは奇妙に思えます。学生は常にクラスを持っている必要がありますか、それとも一時的にクラスの割り当て (およびセクションの割り当ても) なしにすることはできませんか? 学生は半年間の休暇学期を持っていて、どのクラスにも参加していませんか?

その場合、Studentsオプションの関係を作成できます。外部キー プロパティを null 許容として宣言するだけです。

public class Students  
{
    //...
    public int? ClassesId { get; set; }  
    public Classes Classes { get; set; }  
    public int? SectionsId { get; set; }  
    public Sections Sections { get; set; }  
}

これにより、クラス内の複数のカスケード削除パスの問題が修正Studentsされます。デフォルトでは、オプションのリレーションシップではカスケード削除が有効になっていないためです。Classesとの関係Sectionsは引き続き必要であるため、クラスを削除すると、そのクラスに属するすべてのセクションも削除されますが、生徒は削除されません。

于 2012-09-13T13:16:35.630 に答える