0

私は3つのクラスを持っています:

public partial class Student : Contact
{   
    //Inherited from Contact:
    //public int ContactId { get; set; }
    //public string FirstName { get; set; }
    //public string LastName { get; set; }

    public virtual StudentExam StudentExam { get; set; }
}

public partial class Exam
{
    public int ExamId { get; set; }
    public string Title { get; set; }
    public DateTime Date { get; set; }

    public virtual StudentExam StudentExam { get; set; }
}

public partial class StudentExam
{
    public byte Score { get; set; }
    public int ContactId { get; set; }
    public int ExamId { get; set; }

    public virtual Student Student { get; set; }
    public virtual Exam Exam { get; set; }
}

DbContext を初期化しようとすると、次のエラーがスローModelValidationExceptionされます: モデルの生成中に 1 つ以上の検証エラーが検出されました: \tSystem.Data.Entity.Edm.EdmEntityType: : EntityType 'StudentExam' にキーが定義されていません。この EntityType のキーを定義します。\tSystem.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'StudentExams' は、キーが定義されていないタイプ 'StudentExam' に基づいています。

StudentExamクラスのプロパティを次のように変更してみました。

[Key, ForeignKey("Student"), Column(Order = 0)]
public int ContactId { get; set; }
[Key, ForeignKey("Exam"), Column(Order = 1)]
public int ExamId { get; set; }

今、私はこの例外を受け取ります:

\tSystem.Data.Entity.Edm.EdmAssociationEnd: : 関係 'StudentExam_Student' のロール 'StudentExam_Student_Source' で多重度が無効です。依存ロール プロパティはキー プロパティではないため、依存ロールの多重度の上限は '*' である必要があります。\tSystem.Data.Entity.Edm.EdmAssociationEnd: : 関係 'StudentExam_Exam' のロール 'StudentExam_Exam_Source' で多重度が無効です。依存ロール プロパティはキー プロパティではないため、依存ロールの多重度の上限は '*' である必要があります。

データ注釈を使用してこれを達成する方法はありますか (データ注釈を使用できる場合、流暢な API を使用するのは好きではありません。流暢な API はコードが乱雑になります。

4

1 に答える 1

2

これは、データ注釈や流暢な API に関するものではなく、正しく定義されていないクラスに関するものです。クラスで定義された関係は、リレーショナル レベルでは有効でないため、まったくマッピングできません。クラスを変更する必要があります。

public partial class Student : Contact
{   
    public virtual ICollection<StudentExam> StudentExams { get; set; }
}

public partial class Exam
{
    ...

    public virtual ICollection<StudentExam> StudentExams { get; set; }
}

このリレーションを定義したら、StudentExamクラスでキーを定義するためにデータ注釈を使用でき、機能します。

ところで。流暢な API により、コードが乱雑になることはありません。乱雑なコードは、API ではなく、プログラマーによって作成されます。データの注釈は、POCO の原則に違反しています。

于 2012-05-13T18:17:17.013 に答える