我正在开始一个新的实体框架项目,并且我定义了实体之间的关系。
我定义了这个简单的实体:
[Table("db_owner.Students")]
public partial class User
{
[Key]
public int Id { get; set; }
[Required]
[StringLength(50)]
public string Name { get; set; }
public int? SchoolClassId { get; set; }
[ForeignKey("SchoolClassId")]
public SchoolClass SchoolClass { get; set; }
}
[Table("db_owner.SchoolClasses")]
public partial class SchoolClass
{
[Key]
public int Id { get; set; }
[Required]
[StringLength(50)]
public string Name { get; set; }
}
但是当我从DB中检索学生时,SchoolClass属性为null。
我还尝试在DBContext定义的OnModelCreating方法中指定关系,但没有任何改变:
modelBuilder.Entity<Student>()
.HasOptional(s => s.SchoolClass).WithMany().HasForeignKey(s => s.SchoolClassId);
我的代码有什么问题?
答案 0 :(得分:2)
使用virtual
关键字为EF代理标记您的关系属性,以便能够超载它:
[ForeignKey("SchoolClassId")]
public virtual SchoolClass SchoolClass { get; set; }
另外,请确保上下文的DbContext.Configuration.ProxyCreationEnabled
属性值设置为true
(默认情况下)。
这两个条件可以延迟加载您的关系。
如果要显式加载它们,请使用包含机制。
答案 1 :(得分:1)
实体框架不会自动加载所有相关实体,因为这会导致它可能加载数据库的重要部分。
您可以使用Include
方法指定要加载的关系:
myDbContext.Users
.Include(u => u.SchoolClass)
.FirstOrDefault(u => u.Id == myId);
您还可以将SchoolClass
属性设为虚拟。假设您启用了延迟加载,这将允许Entity Framework生成派生类,该类将在首次访问该属性时加载相关实体。但请注意,这将导致另一个数据库查询,而Include
则不会。
答案 2 :(得分:0)
为标记为虚拟的导航属性调用延迟加载。否则,您必须明确告知实体框架加载相关数据。