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

时间:2015-01-29 11:55:22

标签: 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;
    }

我首先获取实体,然后对属性进行更改,然后更新实体。在这种情况下,条目的状态永远不会Detached,因此永远不会调用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表现得像这样?

2 个答案:

答案 0 :(得分:3)

这一行:

dbEntityEntry.State = EntityState.Modified;

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

因此,EF发送一条带有所有实体字段的SQL语句进行更新。

答案 1 :(得分:-1)

所有你需要的是:

    public virtual void Update(T entity)
    {
        DbSet.Attach(entity);
        DbSetFactory.ChangeEntityState(entity, EntityState.Modified);
    }