微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EF Core 5 更新未更改的实体和属性

如何解决EF Core 5 更新未更改的实体和属性

我有以下代码优先模型:

public abstract class BaseEntity
{
    public int Id { get; set; }
}

public class Field : BaseEntity
{
    public string Value { get; set; }
    public Component Component { get; set; }
    public string Status { get; set; }

    public Field() { }
    
    public Field(string value,Component component,string status = null)
    {
        Value = value;
        Component = component;
        Status = status;
    }
}

public class Component : BaseEntity
{
    public string Title { get; set; }

    [ForeignKey("SmartObject")]
    public int? SmartObjectId { get; set; }
    public Component SmartObject { get; set; }

    [ForeignKey("Parent")]
    public int? ParentId { get; set; }
    public Component Parent { get; set; }
    public ComponentType Type { get; set; }
    public virtual ICollection<Field> Fields { get; set; }
    public IList<QueryComponent> Queries { get; set; }
    public IList<ReportComponent> Reports { get; set; }
}

以及以下逻辑(这里是用伪代码编写的,可能我遗漏了一些东西,在这种情况下 - 道歉):

public class SampleClass
{
     IFieldRepository _fieldRepository;

     public SampleClass(IFieldRepository fieldRepository)
     {
          _fieldRepository = fieldRepository;
     }

     public void UpdateStatus()
     {
         var fieldList = _fieldRepository.GetById(3);
         
        foreach (var item in updateFVList_Formatted)
        {
             item.Status = "new";
             _fieldRepository.disableChange(item);
        }
     }
}

public class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : BaseEntity
{
    internal ApplicationDBContext _context;
    internal DbSet<TEntity> _entity;

    public BaseRepository(ApplicationDBContext context)
    {
        _context = context;
        _entity = _context.Set<TEntity>();
    }

    public void GetById(int ID)
    {
        return _entity.Where(x => x.Id == ID).ToList();
    }

    public void disableChange(Field field)
    {
        _context.Entry(field).State = EntityState.Unchanged;
        _context.Entry(field.Component).State = EntityState.Unchanged;
    }
}

这里正在调用“UpdateStatus”方法

我遇到的问题以及“disableChange”方法的原因是 EF Core 决定“组件”属性已更改或其他内容,并且在保存更改时,无论我做什么都与“ Component” - EF Core 更新数据库中的“Component”表并将其“ParentId”属性设置为 NULL,以及任何其他实际更改。

因此,例如使用以下伪代码,如果省略对“disableChanges”的调用而我只调用 DbContext.SaveChanges(),EF Core 将更新“Field”表中的条目和“ParentId”列“组件”表。

我尝试告诉 EF Core“组件”没有通过“disableChange”方法更改,但所做的只是省略了“字段”表中条目的更新子句。导致单个 UPDATE 到“组件”表。

我无法弄清楚为什么会发生这种情况以及如何预防。我希望 EF Core 只更新我实际更改的“字段”项。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。