![](/img/trans.png)
[英]Mock or better workaround for AsNoTracking in ASP.NET Core
[英]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.