相关实体未加载

时间:2015-06-23 08:47:17

标签: c# .net entity-framework

我正在开始一个新的实体框架项目,并且我定义了实体之间的关系。

我定义了这个简单的实体:

[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);

我的代码有什么问题?

3 个答案:

答案 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)

为标记为虚拟的导航属性调用延迟加载。否则,您必须明确告知实体框架加载相关数据。