gpt4 book ai didi

c# - EFCore 5.0 : Change tracker when DbContext is disposed (DbContext lifetime)

转载 作者:行者123 更新时间:2023-12-04 08:02:33 24 4
gpt4 key购买 nike

我正在使用 EFCore 加载“用户”实体和用户制作的相关“订单”。
我有一个构造函数(来自真实代码的简化示例),它使用 id=1 加载用户并实现一个命令来更新 LoadedUser 实体中的更改。但是当前代码中的 CmdApply 显然是错误的:

public User LoadedUser { get; set; }

public MyViewModel
{
LoadedUser = loadUser(1);

CmdApply = new ActionCommand(p =>
{
using (var db = new MyDbContext())
{
try
{
// Save changes into database
db.SaveChanges();
}
catch (Exception e)
{
UiTools.StatusBar.AddNotification($"Failed to update user in database: {e.InnerException.Message}");
}
}, p => true)); // TODO Instead 'true' check for changes in LoadedUser
}
loadUser() 方法如下:
private User loadUser(int id)
{
using (var db = new MyDbContext())
{
// Load the user completely with all its navigation properties
var loadedUser = db.Users
.Include(s => s.Orders)
.SingleOrDefault(s => s.Id == id);

return loadedUser;
}
}
因此,在构造函数中调用 loadUser() 之后,MyDbContext 被释放,因为 using 块被留下。现在,当调用 CmdApply 时,用户不会被保存,因为它与 DbContext 分离,因为 using 块导致 DbContext 的生命周期短。
当然,我可以在构造函数中创建 DbContext,然后只要 View 模型活着它就会活着。但正如我在文档中读到的那样,DbContexts 应该尽可能短地存活。这样的情况如何处理?

最佳答案

我认为可以这样解决:

  • 加载您的用户,配置 DBContext
  • 将您的用户模型保存在某处
  • 保存时创建新的 DBContext
  • 在新上下文中更新您的模型。
  • 调用 db.SaveChanges()

  • 看这里: DbContext.Update on MSDN

    关于c# - EFCore 5.0 : Change tracker when DbContext is disposed (DbContext lifetime),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66383160/

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