gpt4 book ai didi

c# - 在 ASP.Net Core 文档中使用 AsNoTracking

转载 作者:行者123 更新时间:2023-11-30 22:57:29 25 4
gpt4 key购买 nike

在 ASP.Net Core 文档中的以下代码中编辑实体时,我一直在尝试理解 AsNoTracking 的使用,发现 here :

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 状态的摘要:

Disabling change tracking is useful for read-only scenarios because it avoids the overhead of setting up change tracking for each entity instance. You should not disable change tracking if you want to manipulate entity instances and persist those changes to the database using Microsoft.EntityFrameworkCore.DbContext.SaveChanges.

显然这不是只读场景,运行此方法的唯一原因是尝试更新数据库中的实体。

是否有解释为何此代码似乎违背了 AsNoTracking 摘要中给出的建议?

最佳答案

在获取 Contact 实例时使用 AsNoTracking() 的事实也是联系人重新附加回 context 的原因将其 State 设置为 EntityState.Modified - 由于 contact 未被 context 跟踪,您需要明确让 context 知道该实体已被修改。

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

NoTracking Queries (微软文档)

通常,您在只读场景(CRUD 的 R 部分)中受益于 AsNoTracking()

至于在片段中使用 AsNoTracking() 的潜在意图,@Panagiotis Kanavos 的 comment恕我直言:

"I think I understand the "cleverness" here - the contact is loaded without tracking to reduce overhead if Update isn't authorized. If it is, the object is reattached and an attempt to Approve is made. Depending on that status, its final status is updated and finally saved."

关于c# - 在 ASP.Net Core 文档中使用 AsNoTracking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53636686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com