gix*_*xen 5 entity-framework entity-framework-5
我首先使用EF模型与POCO实体和自定义DbContexts.我的问题是设置LazyLoadingEnabled=false不会影响任何东西,导航属性仍然加载.下面是我简化的例子.
实体计划.程序可以是其他程序的一部分:
namespace Domain.Entities
{
using System;
using System.Collections.Generic;
public partial class Program
{
public Program()
{
this.Programs = new HashSet<Program>();
}
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public System.DateTime StartDate { get; set; }
public System.DateTime EndDate { get; set; }
public Nullable<int> ProgramId { get; set; }
public virtual ICollection<Program> Programs { get; set; }
public virtual Program OwnerProgram { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
DbContext:
namespace Infrastructure.Model
{
public class ProgramContext : DbContext
{
public ProgramContext()
: base("name=MyContainer")
{
Configuration.LazyLoadingEnabled = false;
}
public DbSet<Program> Programs { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
这是我如何使用它:
private ProgramContext _dbContext = new ProgramContext();
// GET api/program
public IEnumerable<Program> GetPrograms()
{
List<Program> list = _dbContext.Programs.ToList();
return list;
}
Run Code Online (Sandbox Code Playgroud)
使用上面的示例,EF仍然会加载Program类的Programs和OwnerProgram属性.我尝试删除虚拟关键字,禁用代理创建,LazyLoadingEnabled=false并在模型本身上验证了这一点.
我错过了什么吗?
您看到的效果称为关系修正.
实际上,未明确加载导航属性.该查询_dbContext.Programs.ToList()仅从Programs数据库加载整个表.这只是一个简单的SQL查询(如SELECT * FROM ProgramsTable),没有任何WHERE子句,也没有任何JOIN相关的行.
此外,当您访问program.Programs和program.OwnerProgram导航属性时,此处不会发生延迟加载(如果禁用它并且禁用动态代理,则实际上不能).
当您的查询结果具体化时,将填充导航属性,因为您的查询(加载所有程序)将加载导航属性可以引用的所有程序.EF检测到那些相关实体已经在内存中并自动将它们放入导航属性中.
如果您不加载所有程序,但只能加载例如一个程序,则可以验证这一点:
Program program = _dbContext.Programs.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
现在,program.Programs和program.OwnerProgram将是null-除非加载的program是它自己的一部分program.OwnerProgram收藏还是自己的OwnerProgram.
| 归档时间: |
|
| 查看次数: |
6188 次 |
| 最近记录: |