物體框架 6.0 dotnet 4.5
此查詢在 DB 中收集一條記錄。如果它在資料庫中不存在,則創建它并加載它。
using (DBContext sq = new DBContext())
{
wfQandA a = sq.wfQandAs.FirstOrDefault(x => x.wfStepID == psid && x.QuestionID == Qid);
if (a == null)
{
wfQandA a1 = new wfQandA();
a1.wfStepID = psid;
a1.QuestionID = Qid;
a1.OverRiden = false;
sq.wfQandAs.Add(a1);
sq.SaveChanges();
a = sq.wfQandAs.FirstOrDefault(x => x.wfStepID == psid && x.QuestionID == Qid);
}
wfStep test= a.wfStep;
}
如果 DB 中存在記錄,則“a”加載動態代理:a ={System.Data.Entity.DynamicProxies.wfQandA_F674B4C0C963114E42A6AF320A5E9E682CF1DA6534BE8FF2F36989FC9BA80D85 可以訪問所有子表。
如果記錄不存在,則創建記錄,并再次查詢a。然而,在這種情況下,'a' 沒有加載動態代理 a= {CALMO_DataModels.Models.wfQandA} 并且所有關聯的子表都為空。
我嘗試使用新創建的 ID 直接重新加載 using SingleOrDefault,同樣的問題。
什么可能導致物體不加載動態代理?
uj5u.com熱心網友回復:
什么可能導致物體不加載動態代理?
您使用其建構式創建了物體。當您查詢已在更改跟蹤器中的物體時,您將獲得現有物件,而不是從資料庫查詢中創建的新物件。
要手動創建代理,請使用DbSet.Create
為該集合的型別創建物體的新實體。請注意,此實體未添加或附加到集合。如果底層背景關系配置為創建代理并且物體型別滿足創建代理的要求,則回傳的實體將為代理。
uj5u.com熱心網友回復:
大衛的回答涵蓋了行為。EF 仍會為您的第二次獲取嘗試執行查詢,但由于它正在跟蹤您創建的實體new,因此它將回傳該實體,而不是新代理。與依賴延遲加載相比,預先加載相關資料通常更好。延遲加載通常應被視為故障安全而不是默認行為,因為它可能會對性能產生重大影響。
所以:
a = sq.wfQandAs.Include(x => x.wfStep)
.Single(x => x.wfStepID == psid && x.QuestionID == Qid);
如果您想要物體的 wfStep,請Include為所有相關物體添加陳述句。
另一種方法是告訴 EF 在呼叫后停止跟蹤您的實體,SaveChanges()以確保組成新的物體代理:
using (DBContext sq = new DBContext())
{
wfQandA a = sq.wfQandAs.SingleOrDefault(x => x.wfStepID == psid && x.QuestionID == Qid);
if (a == null)
{
a = new wfQandA();
a.wfStepID = psid;
a.QuestionID = Qid;
a.OverRiden = false;
sq.wfQandAs.Add(a);
sq.SaveChanges();
sq.Entity(a).State = EntityState.Detatched; // Tells DbContext to stop tracking this instance.
a = sq.wfQandAs.Single(x => x.wfStepID == psid && x.QuestionID == Qid);
}
wfStep test= a.wfStep;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/313339.html
