我有三个班级:
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 :: Multiplicity在关系'StudentExam_Student'中的角色'StudentExam_Student_Source'中无效。由于“从属角色”属性不是关键属性,因此从属角色的多重性的上限必须为“*”。 \ tSystem.Data.Entity.Edm.EdmAssociationEnd :: Multiplicity在关系'StudentExam_Exam'中的角色'StudentExam_Exam_Source'中无效。由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为'*'。
有没有办法用数据注释实现这一点(当我可以使用数据注释时,我不喜欢使用流畅的API;流畅的API会导致代码混乱。
答案 0 :(得分: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原则。