2016-09-23 168 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將有助於並不再加載嵌套的對象,這是奇怪的,但這是實體框架如何工作