【问题标题】:EF Core tracked entities not being savedEF Core 跟踪的实体未保存
【发布时间】:2021-04-20 16:31:09
【问题描述】:

我正在通过依赖注入访问我的数据库实例,它的作用域是请求。

这是我startup.cs的代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<AppDbContext>(options =>
        {
            options.UseSqlServer(Configuration.GetConnectionString("ApiEntity"));
            options.EnableSensitiveDataLogging(true);
        });

    services.AddRazorPages();
}

在我的index.cshtml.cs 文件中,我有一个我想要更新的项目列表。我将它们绑定到 PageModel,如下所示:

    [BindProperty]
    public List<Project> Projects { get; set; }

当使用更新的实体调用 OnPost 方法并且我运行 _context.SaveChanges(); 时,跟踪的实体不会得到更新。

当我首先尝试通过调用更新实体时:_context.UpdateRange(Projects); 我收到以下错误:

InvalidOperationException:无法跟踪实体类型“Project”的实例,因为已经在跟踪另一个具有与 {'ProjectId'} 键值相同的实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值

我查看了此错误消息的其他示例,解决方案似乎是scope your repository(我已经是)或detach your entity and then reattach it,但我不确定为什么要添加这种额外的复杂性。我应该能够通过简单地调用_context.saveChanges 来更新正在跟踪的实体。这可能吗 ?如果是这样,我做错了什么?

【问题讨论】:

  • 我们需要您的代码来处理 POST 并进行更新

标签: .net asp.net-core entity-framework-core


【解决方案1】:

好吧,我想通了。我会为其他疲倦的开发人员继续这样做:

在我的cshtml.cs 文件中,我在构造函数中分配了Projects

    public ProjectsPageModel(AppDbContext _context)
    {
        this._context = _context;
        Projects = _context.Projects.ToList();
    }

当我从构造函数中删除 db 调用并将调用放在 OnGet 方法中时,我能够通过以下方式成功更新 db:

         _context.UpdateRange(Projects);
         _context.SaveChanges();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多