簡體   English   中英

Entity Framework Core:使用 AsNoTracking 過濾 Include 時的奇怪行為

[英]Entity Framework Core: strange behaviour when filtering on Include with AsNoTracking

我不知道是否應該這樣,但我認為這很奇怪,因為更改了查詢結果。

當我執行下面的查詢時,我得到的實體只有 2 個“Mensagens”實體,因為我只過濾活動實體,所以這是正確的,我的數據庫中有 2 個活動實體和 1 個不活動實體。

return await context.Lancamentos
            .Include(x => x.UsuarioCriacao)
            .Include(x => x.Mensagens.Where(m => m.Ativo))
            .ThenInclude(m => m.MensagemMedias)
            .ThenInclude(m => m.MediaWhatsapp)
            .ThenInclude(m => m.TipoMediaWhatsapp)
            .Include(x => x.Mensagens.Where(m => m.Ativo))
            .ThenInclude(x => x.TemplateMensagem)
            .ThenInclude(t => t.Medias)
            .ThenInclude(m => m.MediaWhatsapp)
            .ThenInclude(m => m.TipoMediaWhatsapp)
            .AsNoTracking()
            .FirstOrDefaultAsync(l => l.Id == id && l.Ativo);

在此處輸入圖像描述

但是,如果我執行完全相同的命令,只是刪除AsNoTracking()行,它會給我 3 條記錄,包括活動的和非活動的。

在此處輸入圖像描述

但是不活動的 EF 不會獲取下面的ThenInclude 它改變了行為。

使用AsNoTracking ,它會根據我在Include上使用的過濾器過濾數據

如果沒有AsNoTracking ,它會給我帶來所有數據,但它會過濾是否會加載ThenInclude對象。

有誰知道這是否是正常行為以及為什么會這樣?

在處理這樣的復雜查詢時,我曾經使用Linq而不是Lambda來確保我對我的同事和我自己的未來足夠清楚。

要了解您的查詢發生了什么,我應該說身份很重要。 例如,這是我從您的查詢中了解到的:

return await context.Lancamentos
            .Include(x => x.UsuarioCriacao)
            .Include(x => x.Mensagens.Where(m => m.Ativo))
                .ThenInclude(m => m.MensagemMedias)
                    .ThenInclude(m => m.MediaWhatsapp)
                        .ThenInclude(m => m.TipoMediaWhatsapp)
            .Include(x => x.Mensagens.Where(m => m.Ativo))
                .ThenInclude(x => x.TemplateMensagem)
                    .ThenInclude(t => t.Medias)
                        .ThenInclude(m => m.MediaWhatsapp)
                            .ThenInclude(m => m.TipoMediaWhatsapp)
                                .AsNoTracking()
            .FirstOrDefaultAsync(l => l.Id == id && l.Ativo);

我覺得你真正想要的是這樣的:

return await (context.Lancamentos
            .Include(x => x.UsuarioCriacao)
            .Include(x => x.Mensagens.Where(m => m.Ativo))
                .ThenInclude(m => m.MensagemMedias)
                    .ThenInclude(m => m.MediaWhatsapp)
                        .ThenInclude(m => m.TipoMediaWhatsapp)
            .Include(x => x.Mensagens.Where(m => m.Ativo))
                .ThenInclude(x => x.TemplateMensagem)
                    .ThenInclude(t => t.Medias)
                        .ThenInclude(m => m.MediaWhatsapp)
                            .ThenInclude(m => m.TipoMediaWhatsapp))
            .AsNoTracking()
            .FirstOrDefaultAsync(l => l.Id == id && l.Ativo);

差異可以通過第一個消息限制和第二個消息限制之間的不同上下文來解釋。 其中一條消息被檢索了兩次,因為其中一條實例位於其中,另一條位於 ef 上下文之外。

您應該再次檢查有關ThenIncludeAsNoTracking擴展方法的文檔,以確保您以正確的方式使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM