示例中的代码:
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; }
}
答案 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访问器。