c# – 为什么Entity Framework在使用存储库模式时不跟踪更改?

我正在使用存储库模式,我的更新方法如下所示:

    public virtual void Update(T entity)
    {
        DbEntityEntry dbEntityEntry = dataContext.GetEntry(entity);
        if (dbEntityEntry.State == EntityState.Detached)
        {
            dbSet.Attach(entity);
        }

        string d1 = dbEntityEntry.CurrentValues.GetValue<string>("Description");
        string d2 = dbEntityEntry.OriginalValues.GetValue<string>("Description");

        bool b = d1 == d2;

        dbEntityEntry.State = EntityState.Modified;
    }

我首先获取实体,然后对属性进行更改,然后更新实体.在这种情况下,条目的状态永远不会被分离,因此从不调用Attach().

如果我更改Description属性,我可以看到原始值和当前值不同.如果属性保持不变,则原始值和当前值都相同.

GetEntry只是我的DBContext中的包装器方法:

public DbEntityEntry GetEntry(object entity)
{
    return base.Entry(entity);
}

我的控制器动作如下所示:

    public IHttpActionResult Update(int id, CustomerTypeDTO customerTypeDto)
    {
        var entity = customerTypeService.Get(id);

        entity.Number = customerTypeDto.Number;
        entity.Description = customerTypeDto.Description;

        entity = customerTypeService.Save(entity);

        return Ok<CustomerTypeDTO >(Mapper.Map<CustomerTypeDTO >(entity));
    }

但是,EF发送一个SQL语句,其中包含所有实体的更新字段,如果它们已更改则无关紧要.

为什么EF表现得像这样?

最佳答案 有了这条线:

dbEntityEntry.State = EntityState.Modified;

您告诉实体框架该实体已被修改.无论它是否真的被修改过.

因此,EF发送一个SQL语句,其中包含所有实体的字段以进行更新.

点赞