如果我想使用ado.net实体框架映射数据库表,我应该遵循外键的特定命名模式吗



我正在阅读以下关于实体框架的教程,该框架使用代码优先的方法链接

它提到,对于EF解释FK,在这两个类之间,我需要使用以下两种命名模式或规则:-

public class Enrollment
{
    public int EnrollmentID { get; set; }
    public int CourseID { get; set; }
    public int StudentID { get; set; }
    public Grade? Grade { get; set; }
    public virtual Course Course { get; set; }
    public virtual Student Student { get; set; }
}
public class Student
{
    public int ID { get; set; }
    public string LastName { get; set; }
    public string FirstMidName { get; set; }
    public DateTime EnrollmentDate { get; set; }
    public virtual ICollection<Enrollment> Enrollments { get; set; }
}

然后实体框架将属性解释为外键属性:

  • Rule1如果它被命名为<navigation property name><primary key property name>(例如,Student导航属性的StudentID,因为Student实体的主键是ID)。

  • Rule2外键属性也可以简单地命名为<primary key property name>(例如,CourseID,因为Course实体的主键是CourseID)。

但是,如果我已经有了一个数据库,而我不遵循这种命名模式,这会是一个问题吗?例如,假设我在sql server Enrollment.StudentNo ---> Student.studentID中定义Student-->Enrollment关系如下,其中我定义了一个名为StudentNo的字段作为student.studentid的FK(我这样做是为了测试目的),那么这会引起任何问题吗?从我自己的测试中,我注意到EF会很高兴地将Enrollment.StudentNoStudent.StudentId映射(即使我可以将FK定义为"NoNamePetten"),那么以上两条规则仅在使用代码优先方法时有效吗?如果我使用DB优先方法,我不需要遵循它们吗?

感谢

如果您使用的是Database First,并且关系存在于SQL数据库中,那么它应该是好的。EF足够聪明,可以在生成的上下文代码中进行映射。

如果您使用的是"代码优先",则不必总是遵循该约定。你可以随心所欲地称呼相关领域,但你需要告诉EF它们之间的确切关系。您可以通过以下两种方式之一实现这一点:在DbContext类中使用Fluent API,或者在实体类中使用Data Annotations(我个人最喜欢)。

要完成您的要求,您可以在Enrollment类中执行以下操作:

public int EnrollmentID { get; set; }
[ForeignKey("Student")]
public int StudentNo { get; set; }
public virtual Student Student { get; set; }

最新更新