2016-09-23 108 views
4

我有2个班,SalesSubCategory和SalesCategory:实体框架6:相关的实体自动添加到父实体,尽管延迟加载被关闭

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

此方法返回SalesSubCategories列表而不SalesCategory对象加载

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

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

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对象实体。

谢谢。

回答

1

是的,这是预期的行为。

当从上下文中加载实体时,玩家中的实体会被附加以跟踪对它们的任何修改,也就是说,由于先前的加载会得到结果。

您可以通过请求查询以非跟踪方式执行来解决此问题。这不会使entityframework将它与您的新查询相关联。

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

神奇,谢谢! – Gmd3

+0

所以环顾四周,看起来好像没有全局设置来适用于我的所有查询......痛苦的 – Gmd3

+0

每个ORM都不同,我猜EntityFramework决定这种行为是因为他们认为人们会使用它们而不是仅仅提取结果转换为强类型对象,但也用于管理其查询结果对象。您可以使用Dapper.NET或某种类似于ORM的更加简化的功能来获得所需的行为,它将为您提供强大的类型对象,而无需使用数据库上下文的概念。 –

0

好,我明白你的意思,这可能是在实体框架中的错误,但我测试了它在本地,以及启用或禁用LazyLoadingEnabled没有帮助。 我发现,当SalesCategory的嵌套对象有另一个嵌套的对象,然后LazyLoadingEnabled将有助于并不再加载嵌套的对象,这是奇怪的,但这是实体框架如何工作