如何在Blazor应用程序中使用MVVM和EF Core仅更新更改字段?

如何在Blazor应用程序中使用MVVM和EF Core仅更新更改字段?,mvvm,entity-framework-core,blazor,change-tracking,Mvvm,Entity Framework Core,Blazor,Change Tracking,我有一个blazor服务器应用程序,使用EF Core作为数据访问层 当用户访问页面时,我从DbContext加载实体,用数据填充VM并处理db上下文 using var dbContext = DbContextFactory.CreateDbContext(); var entity = dbContext.Products.Find(Id); ViewModel = new ViewModel { Id = entity.Id, Name = entity.Name.. } 当用户单击

我有一个blazor服务器应用程序,使用EF Core作为数据访问层

  • 当用户访问页面时,我从DbContext加载实体,用数据填充VM并处理db上下文

    using var dbContext = DbContextFactory.CreateDbContext();
    var entity = dbContext.Products.Find(Id);
    ViewModel = new ViewModel { Id = entity.Id, Name = entity.Name.. }
    
  • 当用户单击“保存”按钮时,我再次从fresh DbContext实例加载实体,将所有可编辑字段从VM复制到实体,并调用DbContext.SaveChanges

    using var dbContext = DbContextFactory.CreateDbContext();
    var entity = dbContext.Products.Find(Id);
    entity.Name = ViewModel.Name; .....
    dbContext.SaveChanges();
    
  • 我希望避免将所有字段从VM复制到实体,因为这将同时覆盖对DB所做的所有更改我只想更新用户编辑的字段

    在ViewModel中实现更改跟踪,特别是在更复杂的层次结构中,是一项非常重要的任务


    我如何在Blazor应用程序中有效地做到这一点?特别是在没有不必要的干冲突的情况下。

    只需在ViewModel中包括哪些字段已更改,并仅更新这些字段。@SvyatoslavDanyliv:关于子集合、添加或删除的项目呢?我不想在每个可能的字段上编写
    if(vm.fieldChanged)entity.Field=vm.Field
    ,也不想为每个字段手动编写更改跟踪,因为这将是大量重复代码,有大量错误空间。是的,我知道我们很懒惰。但是谁来代替我们写呢?可以使用和生成跟踪更改的ViewModels。我还没有看到框架(库),它可以为您做到这一点,并通过网络发送信息,然后自动应用图形更改…您可以在加载页面时序列化模型,然后在更新时反序列化它,并使用反射逐个将属性与更新后的模型进行比较。这样,它可以是一个通用过程,可以适用于所有模型。