为什么"建议在实体类中包含外键属性"?

时间:2015-11-02 13:04:42

标签: c# entity-framework

示例中的代码:

public class Student
{
    public Student() { }

    public int StudentId { get; set; }
    public string StudentName { get; set; }

    public int StdandardRefId { get; set; }

    [ForeignKey("StandardRefId")]
    public virtual Standard Standard { get; set; }
}

public class Standard
{
    public Standard()
    {
        StudentsList = new List<Student>();
    }
    public int StandardId { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}

2 个答案:

答案 0 :(得分:4)

想象一下你想要设置关系的场景,但你没有内存中的Standard实例,唯一的就是StandardId。这将要求您首先在数据库上执行查询以检索所需的Standard实例,以便您可以设置Standard导航属性。有时您可能没有内存中的对象,但您可以访问该对象的键值。使用外键属性,您只需使用键值而不依赖于在内存中具有该实例:

 int standardId=2;
 //...
 student.StdandardRefId =standardId;

总之,在FK属性中,您将有两个选项来设置关系。

我的建议是当您需要创建与现有Student相关的新Standard时,设置FK属性而不是导航属性。在某些情况下,实体框架会将Standard的状态设置为Added,即使它已存在于数据库中,这可能会导致数据库中的重复。如果您只使用外键,则可以避免此问题。

答案 1 :(得分:0)

通过指定虚拟标准标准属性,您已告知实体框架您的Student对象与零个或一个标准对象相关。

为了让Entity Framework使用延迟加载自动检索此对象(因为您指定了虚拟),您还必须通过为其提供外键注释来准确地告诉它对象的关联方式。当您第一次尝试访问Standard属性时,Entity Framework将自动尝试在主键与您的外键匹配的上下文中查找匹配的Standard对象。

如果您未指定关系,则可以手动检索标准对象并使用属性的set访问器。