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' has no key defined。定义此 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 回答