簡體   English   中英

在 ASP.Net Core 文檔中使用 AsNoTracking

[英]Use of AsNoTracking in ASP.Net Core docs

在 ASP.Net Core 文檔中的以下代碼中編輯實體時,我一直試圖了解 AsNoTracking 的使用,可在此處找到:

public async Task<IActionResult> OnPostAsync(int id)
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

    // Fetch Contact from DB to get OwnerID.
    var contact = await Context
        .Contact.AsNoTracking()
        .FirstOrDefaultAsync(m => m.ContactId == id);

    if (contact == null)
    {
        return NotFound();
    }

    var isAuthorized = await AuthorizationService.AuthorizeAsync(
                                             User, contact,
                                             ContactOperations.Update);
    if (!isAuthorized.Succeeded)
    {
        return new ChallengeResult();
    }

    Contact.OwnerID = contact.OwnerID;

    Context.Attach(Contact).State = EntityState.Modified;

    …

    await Context.SaveChangesAsync();

    return RedirectToPage("./Index");
}

AsNoTracking 的摘要指出:

禁用更改跟蹤對於只讀場景很有用,因為它避免了為每個實體實例設置更改跟蹤的開銷。 如果要使用 Microsoft.EntityFrameworkCore.DbContext.SaveChanges 操作實體實例並將這些更改持久保存到數據庫,則不應禁用更改跟蹤。

顯然,這不是只讀方案,運行此方法的唯一原因是嘗試更新數據庫中的實體。

有沒有解釋為什么這段代碼似乎違背了 AsNoTracking 摘要中給出的建議?

在獲取Contact實例時使用AsNoTracking()的事實也是將聯系人重新附加回context並將其State設置為EntityState.Modified - 由於context未跟蹤contact ,您需要明確地讓context知道該實體已被修改。

如果未使用AsNoTracking()則不需要。

NoTracking 查詢(MS 文檔)

通常,您在只讀場景( CRUD的 R 部分AsNoTracking()中受益於AsNoTracking() )

至於在片段中使用AsNoTracking()的潛在意圖,@Panagiotis Kanavos 的評論是恕我直言:

“我想我理解這里的‘聰明’——如果更新未被授權,則在不跟蹤的情況下加載聯系人以減少開銷。如果是,則重新附加對象並嘗試批准。根據該狀態,其最終狀態已更新並最終保存。”

暫無
暫無

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

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