我發現了很多其他帖子,但他們面對完全相同的問題。他們使用的代碼略有不同。所以我認爲值得回顧一下。實體框架6上下文不檢索導航屬性
我先使用EF6代碼,然後創建了一個具有一些導航屬性的客戶端實體。
我會發布相關的代碼,考慮還有一些屬性和外鍵,但與問題無關。模型正在生成。
public class Client
{
public Client()
{
JobsExperiences = new Collection<JobsExperience>();
CapacitationCourses = new Collection<CapacitationCourse>();
ScholarLevelDetails = new Collection<ScholarLevelDetail>();
Relatives = new Collection<Relative>();
}
public long ClientID { get; set; }
public virtual ICollection<ScholarLevelDetail> ScholarLevelDetails { get; set; }
public virtual ICollection<JobsExperience> JobsExperiences { get; set; }
}
現在,我創建了一個ClientServices類,我把那獲取或往返於數據庫發送數據。所有的方法,療法我有這樣的代碼,這是工作隨機,I'll儘量解釋清楚。
internal Client GetClient(string userId, bool lazyLoadingEnabled = true)
{
using (var context = new ApplicationDbContext())
{
context.Configuration.LazyLoadingEnabled=lazyLoadingEnabled;
var client = (from _client in context.Client
where _client.ApplicationUserId == userId
select _client).FirstOrDefault();
return client;
}
}
我的目標有些情況下是隻獲得了客戶的屬性,有時所有的屬性,包括導航屬性。
在我的控制器我有這樣
var client = uuc.GetClient(user.Id, false);
線或這
var client = uuc.GetClient(user.Id);
當我運行的第一句話,導航屬性初始化但都有數= 0,即使我的數據庫有關聯的記錄。我認爲,如果延遲加載被禁用,則意味着啓用加載,但似乎不是。但是,導航屬性中沒有Load()方法來強制加載。
當運行第二句,在導航屬性拋出異常「client.ScholarLevelDetails」扔類型「System.ObjectDisposedException」的異常。這句話在句子後面引出一行,引起手錶中的導航屬性。但是,這是最奇怪的部分,如果我退回到句子並調試進入方法,所有導航屬性都會正確加載。
爲什麼代碼的行爲不同,如果一次運行而不是跑步進入方法? 我認爲使用語句範圍在導航屬性加載之前完成,但爲什麼禁用lay loading doe snot檢索它們呢? 我該如何編碼以獲得一致的行爲?
您的線路'context.Configuration.LazyLoadingEnabled = lazyLoadingEnabled;'沒有爲您做任何事情。您渴望加載所有的導航屬性,這就是它工作的原因。簡單的LINQ確實有效,但是沒有看到你嘗試過的例子,我們無法告訴你爲什麼你的實現不起作用。 –
除了我在問題中發佈的內容,還需要了解我們是否可以解開Linq沒有工作的原因?同時發佈我可以發佈的所有東西 –
看起來,如果您想使用查詢語法,您需要選擇一種匿名類型,其中包含所需的所有數據。 http://stackoverflow.com/questions/6761104/how-does-linq-expression-syntax-work-with-include-for-eager-loading –