0

私は3つのクラスがあります つ以上の検証エラーがモデルの生成中に検出されました: \ tSystem.Data.Entity.Edm.EdmEntityType追加のプロパティを持つ関係マッピングテーブル?

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スロー::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 :: Multiplicityは、 'StudentExam_Exam'という関係の 'StudentExam_Exam_Source'ロールでは無効です。依存ロールのプロパティはキープロパティではないため、依存ロールの多重度の上限は「*」でなければなりません。

することで、データの注釈でこれをで達成するためにどのような方法は、(私はデータ注釈を使用することができたときに流暢なAPIを使用して好きではありませんあり、流暢なAPIはきたないコードにつながる

答えて

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クラスのキーを定義するためのデータ注釈が機能します。

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

+0

私は自分のPOCOをきれいに保ち、後でメタデータを追加します。メタデータを追加することの利益は、独立した検証でもあります(これは流暢でも達成可能ですか?)。とにかく、わかりやすいコードでは、すべての流暢なコードは、個々のエンティティではなく、(そのようなメソッドやその他の実装によって)1つの 'OnModelCreated'メソッドに入ります。私は生成されたエンティティを扱っているので、実際のオープンなPOCOではありません(これはコンストラクタを使ってnavプロパティを初期化します。したがって、部分クラスにctorを書き込むことはできません。 genエンティティを呼び出します。 – Shimmy

関連する問題