【问题标题】:Entity Framework 6: related entities auto added to parent entity despite lazy loading being turned off实体框架 6:尽管延迟加载已关闭,但相关实体会自动添加到父实体
【发布时间】:2016-09-23 22:48:29
【问题描述】:

我有 2 个类,SalesSubCategory 和 SalesCategory:

[Table("SALES.SubCategory")]
public class SalesSubCategory
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public int CategoryID { get; set; }

    public string Name { get; set; }

    [ForeignKey("CategoryID")]
    public SalesCategory SalesCategory { get; set; }
}

[Table("SALES.Category")]
public class SalesCategory
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public string Name { get; set; }
}

此方法返回未加载 SalesCategory 对象的 SalesSubCategories 列表

public class TestController : Controller
{
    private readonly MD_Context _context;

    public TestController(MD_Context context)
    {
        _context = context;
    }
    public async Task<List<SalesSubCategory>> NoRelated()
    {
        var subCategories = await _context.SalesSubCategories.ToListAsync();
        return subCategories;
    } 

Related Entity not Loaded

此方法返回已加载 SalesCategory 对象的 SalesSubCategories 列表

public async Task<List<SalesSubCategory>> Related() 
{
    var subCategories = await _context.SalesSubCategories.ToListAsync();
    var categories = await _context.SalesCategories.ToListAsync();
    return subCategories;
} 

Related Entity loaded

MD_Context 配置为禁用延迟加载:

Configuration.LazyLoadingEnabled = false;

这是预期的行为吗?我的首选结果是不预加载 SalesCategory 对象实体。

谢谢。

【问题讨论】:

    标签: c# entity-framework entity-framework-6


    【解决方案1】:

    是的,这是预期的行为。

    当从上下文中加载实体时,正在播放的实体会被附加,以便跟踪对它们的任何修改,也就是说,由于之前的加载,您会得到结果。

    您可以通过请求以非跟踪方式执行查询来解决它。这不会使实体框架将其与您的新查询相关联。

    var subCategories = await _context.SalesSubCategories.ToListAsync();
    var categories = await _context.SalesCategories.AsNoTracking().ToListAsync();
    

    【讨论】:

    • 所以环顾四周,似乎没有全局设置可以将其应用于我的所有查询...痛苦
    • 每个 ORM 都是不同的,我猜 EntityFramework 决定这种行为是因为他们相信人们会使用它们不仅仅是将结果提取到强类型对象中,还用于管理他们的查询结果对象。您可以使用 Dapper.NET 或某种更剥离的功能(如 ORM)来实现您所需的行为,它将使您能够在没有 db 上下文概念的情况下使用强类型对象。
    【解决方案2】:

    我明白你的意思,这可能是实体框架中的一个错误,但我在本地对其进行了测试,启用或禁用 LazyLoadingEnabled 没有帮助。 我发现当作为 SalesCategory 的嵌套对象有另一个嵌套对象时,LazyLoadingEnabled 将提供帮助并且不再加载嵌套对象,这很奇怪,但这就是实体框架的工作原理

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 2014-10-23
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多