Ef4 code only 延迟加载不起作用
我在使用EF代码first 4.1时遇到问题,可能不理解某些东西 我的理解是,通过将关系(无论是集合还是单个对象)标记为虚拟,它们将根据需要延迟加载,因此我可以执行以下操作: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
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; }
}