我有這個模型

在我的資料庫中,當我通過 Organismo 過濾 Ofertas 時,我得到了這些結果

我看到 id=6 的有機體有 2 個不同的 Ofertas
當我在 Web API 中將此查詢轉換為 EF 時
// GET: api/Ofertas/organismo/vasco
[HttpGet("organismo/{organismoId}")]
public IEnumerable<Oferta> GetOfertasByOrganismo(int organismoId)
{
var result = _context.Ofertas.Include(o => o.Concurso).ThenInclude(c
=> c.Organismo).Where(o => o.Concurso.Organismo.Id ==
organismoId).ToList();
return result;
我發起這個請求 http://localhost:5000/api/ofertas/organismo/6
我得到這些結果
result
Count = 1
[0]: {Boletus_back_end.Domain.Oferta}
也就是說,只有一個Oferta

在我的 Web API 中,我的 Db 背景關系已斷開連接
services.AddDbContext<BoletusContext>(opt=>
opt.UseSqlServer(Configuration.GetConnectionString("BoletusConexion"))
.EnableSensitiveDataLogging()
.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));
任何想法,關于如何獲得所有相關的Ofertas?
謝謝
uj5u.com熱心網友回復:
您可能需要發布代碼,但是當專案禁用延遲加載,然后嘗試查詢尚未加載所請求的相關資料的物化物體,或者他們急切地加載了該資料并且相關物體是可選的時,通常會出現此問題。
例如,這樣的事情:
var results = context.Ofertas.AsNoTracking().ToList();
var test = results.Where(x => x.Concurso.Organismo.Id == 1).ToList();
這里的問題是我們沒有在原始查詢中獲取 Ofertas 的 Concursos 或 Oransimos,我們已經在第一次ToList呼叫時實作了結果。解決方案要么確保我們將Where條件放在可以集成到查詢中的某個位置,要么確保我們急切加載所有相關資料,并確保考慮可選/空參考:
a) 在查詢中:
var results = context.Ofertas.AsNoTracking()
.Where(x => x.Concurso.Organismo.Id == 1).ToList();
這將通過,因為我們的查詢將查找并回傳具有所需 Organismo ID 的 Ofertas,即使資料中的關系是可選的。但是,它不會在回傳 Ofertas 時急切加載 Concurso 或 Organismo。這些參考仍然可以為空。
b) 熱切加載相關資料并檢查#Null:
var results = context.Ofertas
.Include(x => x.Concurso)
.ThenInclude(x => x.Organismo)
.AsNoTracking()
.ToList();
var test = results.Where(x => x.Concurso?.Organismo?.Id == 1).ToList();
// or
var test = results.Where(x => x.Concuso != null
&& x.Concurso.Organismo != null
&& x.Concurso.Organismo.Id == 1).ToList();
與原始查詢一樣,這會預取所有 Ofertas,但會立即加載所有相關資料。僅當/當關系可以為 NULL 時才需要空檢查。如果需要關系并且急切加載,則不需要空檢查,但它要求資料要么被急切加載,要么能夠被延遲加載。
有趣的是,如果/在這些物體已經被跟蹤的情況下,EF 將填充相關物體。因此,例如,如果之前有任何內容加載了第一個 Oferta 結果參考的一個或多個 Concurso 以及 Organismo ID #1,那么這些參考將存在于回傳的查詢資料中。在這種情況下,我將急切地加載 Concursos Oferta,但只預取 Organismo #1:
var organismo = context.Organismos.Single(x => x.Id == 1);
// The DbContext is now tracking this entity, we do nothing with this instance.
var results = context.Ofertas.Include(x => x.Concurso).AsNoTracking.ToList();
var test = results[0].Concurso.Organismo.Id == 1; // Passes in our case.
var test2 = results.Where(x => x.Concurso.Organismo.Id == 1).ToList(); // can still fail!
第一個測驗將通過,因為當我們從 DbContext 加載 Ofertas 時,該背景關系已經在跟蹤 Organismo #1,因此即使我們不急于加載有機體,它也會預先填充它。但是,除非所有參考恰好是#1,否則其余的 Organismo 參考將為空,并且第二個測驗將繼續失敗。
uj5u.com熱心網友回復:
對不起
問題是 Concursos 表中的資料丟失了將 Ofertra 與 Concurso 相關的記錄
現在一切正常
test
Count = 2
[0]: {Boletus_back_end.Domain.Oferta}
[1]: {Boletus_back_end.Domain.Oferta}
謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/359175.html
