2016-06-07 100 views
1

可能是一個簡單的問題,但有些東西我無法理解。EF6自動包含嵌套對象

我的結構捆綁 - > BundleMembers - > InsuranceTypes

當我檢索單個記錄表BundleMembers,我包括捆綁。 EF6自動包含在捆綁

例如,所有BundleMembers:

enter image description here

public async Task<List<BundleMember>> GetBundleMembers(string userId, bool includeBundle, bool includeInsuranceTypes) 
{ 
    var bundleMembers = db.BundleMembers.Where(m => string.Equals(m.UserId, userId, StringComparison.CurrentCultureIgnoreCase)); 
    if (includeBundle) 
    { 
     bundleMembers = bundleMembers.Include(o => o.Bundle); 
    } 
    if (includeInsuranceTypes) 
    { 
     bundleMembers = bundleMembers.Include(m => m.BundleMemberInsuranceType); 
    } 

    return await bundleMembers.ToListAsync(); 
} 

我調用該函數是這樣的:

GetBundleMembers(_userManager.GetUserId(User), true, false) 

我必須從捆綁訪問數據,避免這種情況?

編輯1: 我的數據模型是這樣的:

public class Bundle 
    { 
     public int BundleId { get; set; } 

     public State State { get; set; } 
     public ICollection<BundleMember> Members { get; set; } 
     public ICollection<InviteLink> InviteLinks { get; set; } 
     public string BundleName { get; set; } 
     public string Description { get; set; } 
     public string ImagePath { get; set; } 

    } 
    public enum State 
    { 
     NotApproved, 
     Approved, 
     Disabled, 
     Rejected 
    } 

    public class BundleMember 
    { 
     public ApplicationUser User { get; set; } 
     public string UserId { get; set; } 
     public int BundleMemberId { get; set; } 
     public int BundleId { get; set; } 
     public Bundle Bundle { get; set; } 
     public bool Admin { get; set; } 
     public int Price { get; set; } 
     public int Coverage { get; set; } 
     public ICollection<BundleMemberInsuranceType> BundleMemberInsuranceType { get; set; } 
    } 

我不包括BundleMemberInsuranceTypeInviteLink,因爲他們工作的罰款。 ApplicationDbContext的

相關部分:

public DbSet<Bundle> Bundles { get; set; } 
public DbSet<BundleMember> BundleMembers { get; set; } 
+0

你確定附加數據沒有被加載嗎?如果你已經標記了你的屬性,虛擬機會在你請求時加載數據。 (這是調試器將會做什麼) – Mo09890

+0

因爲我不是100%確定當延遲加載被觸發時,所以我不能說我肯定這不是問題。 Members屬性是非公開的,所以這不是問題。 我可以從visual studio的輸出窗口看到數據正在被調用而沒有調試器。 – Frey

+0

你可以發佈你的實體類,以及你的相關部分的上下文類嗎? – jpgrassi

回答

1

的建議中評論說:

所描述的行爲實際上是預期。由於includeBundled設置爲true,因此Bundles和引用的BundleMembers都位於上下文中,並且關係修正會根據FK關係設置所有導航屬性。

顯然,這既可以從Bundlemembers到Bundle,也可以從Bundle到BundleMembers,因爲.Include無非是創建SQL語句來將相關條目加載到上下文中,關係修復將完成剩下的工作。

要使Bundle沒有BundleMembers,您必須在上下文中沒有BundleMembers的情況下加載它們,並自己設置導航屬性(EF將始終設置直接和反向導航屬性)。爲了做到這一點,主要有兩種方法:

- 要麼在沒有先前加載的BundleMembers的情況下在新鮮的上下文中加載你的bundle(最好的做法是將它們加載到內存中,因爲IF導航屬性由於加載;您可以將條目附加到兩個上下文中,並拋出異常)或

- 在將Bundle加載到BundleMembers之前從上下文中獲取BundleMembers。