Ef4 code only 延迟加载不起作用

Ef4 code only 延迟加载不起作用,ef4-code-only,Ef4 Code Only,我在使用EF代码first 4.1时遇到问题,可能不理解某些东西 我的理解是,通过将关系(无论是集合还是单个对象)标记为虚拟,它们将根据需要延迟加载,因此我可以执行以下操作: var page = context.Pages.Where(xxxx); var department = page.Department; //load this on demand? var name = department.Name; //null reference exception 但是,page.De

我在使用EF代码first 4.1时遇到问题,可能不理解某些东西

我的理解是,通过将关系(无论是集合还是单个对象)标记为虚拟,它们将根据需要延迟加载,因此我可以执行以下操作:

var page = context.Pages.Where(xxxx);

var department = page.Department; //load this on demand?
var name = department.Name; //null reference exception
但是,page.DepartmentId已正确填充。此外,使用context.Entrypage.Referencep=>p.Department.Load手动加载引用是可行的,但拥有对象模型的全部意义在于不必到处都这么做

public class Page
{
  public int DepartmentId { get; set; }
  public virtual Department { get; set; }
}

public class Department
{
  public virtual ICollection<Page> Pages { get; set; }
}
关于模型创建的上下文

 modelBuilder.Entity<Page>().HasRequired(x => x.Department).WithMany(y => y.Pages).HasForeignKey(x => x.DepartmentId).WillCascadeOnDelete(false);

当然,我没有禁用延迟加载。

您的项目中的某些地方可能有问题。我根据您的作品创建了一个简单的应用程序,一切都很好。试试看,有什么不同

首先,我的简单背景:

class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Page>().HasRequired(x => x.Department).WithMany(y => y.Pages).HasForeignKey(x => x.DepartmentId).WillCascadeOnDelete(false);
    }

    public IDbSet<Page> Pages { get; set; }
    public IDbSet<Department> Departments { get; set; }
}
您应该看到代理散列可能会略有不同:

0
0
System.Data.Entity.DynamicProxies.Page_6D31E91F3B1E767826A19855D3A934B59F85AC161548E4761283C85824520E1D
test
前两个零可以确定,上下文中没有实体。Page类的类型应该是proxy,如果是程序本身的类型,则不会生成代理。可能是关闭了,或者某个东西不是虚拟的,等等。最后一行是部门的实际名称

当我运行程序时,除了其他查询外,还:

SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[Name] AS [Name]
FROM [dbo].[Departments] AS [Extent1]
WHERE [Extent1].[ID] = @EntityKeyValue1

已发送到数据库。

请尝试以下页面模型,看看是否有帮助

public class Page
{
    public int DepartmentId { get; set; }
    public virtual Department Department { get; set; }
}

您缺少部门的变量。希望它现在能起作用

我发现我的处境中出了什么问题。我将默认构造函数标记为private,因此ef没有为我生成代理


谢谢大家。

部门的标识符是什么?
0
0
System.Data.Entity.DynamicProxies.Page_6D31E91F3B1E767826A19855D3A934B59F85AC161548E4761283C85824520E1D
test
SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[Name] AS [Name]
FROM [dbo].[Departments] AS [Extent1]
WHERE [Extent1].[ID] = @EntityKeyValue1
public class Page
{
    public int DepartmentId { get; set; }
    public virtual Department Department { get; set; }
}