0

我有三類:關係映射表與附加屬性?

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:模型生成過程中檢測到 一個或多個驗證錯誤: \ 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導致亂碼

回答

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清潔,我稍後向它添加元數據。添加元數據的收益也是獨立的驗證(流利性也可以實現這一點)。無論如何,通過凌亂的代碼,我的意思是說,所有流利的代碼進入一個「OnModelCreated」方法,而不是每個單獨的實體(通過實施這種方法或其他)。我正在處理生成的實體,所以它們無論如何都不是真正的開放式POCO(它使用構造函數來初始化nav.properties,因此ctor不能寫入部分類中).Sin是我添加了一個「OnCreated」部分方法並在生成實體中調用。 – Shimmy