ObjectSet.ApplyCurrentValues v / s StateManager.ChangeObjectState

时间:2011-05-18 01:36:38

标签: c# .net asp.net entity-framework poco

我是Entity Framework 4.1的新手。我开始用EF作为我的DAL编写一个新的应用程序。我正在使用POCO类(使用POCO t4模板)和数据库第一种方法。

我的GenericRepository已经达到Update方法

public void Update(TEntity entity)
{
    if (entity == null)
    {
        throw new ArgumentNullException("entity");
    }

    _context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
    //_objectSet.ApplyCurrentValues(entity);
}

我有一个gridview,它是具有UpdateMethod =“UpdateStore”的ObjectDataSource的数据绑定,只有一个参数如下...

public void UpdateStore(Store franchise)
{
    unitOfWork.StoreRepository.Attach(franchise);
    unitOfWork.StoreRepository.Update(franchise);
    unitOfWork.SaveChanges();
}

我在这里提出了几个问题:

  1. 当我看到ApplyCurrentValues的文档时,它证明我应该使用它来更新值,但这不起作用(正如您在上面的注释行中所见)。然后当我尝试使用ObjectStateManager.ChangeObjectState时,它可以工作。这两种方法有什么区别。

  2. 如您所见,我首先附加然后应用更新方法。我可以在GenericRepository更新方法中组合附加和更新状态。这样做有什么陷阱吗?

1 个答案:

答案 0 :(得分:3)

    当您从数据库加载了附加实体并且想要从ApplyCurrentChanges收到的分离实体更新其值时,将使用
  1. ObjectDataSource。执行此操作时,所有新值都将复制到附加实体,并自动标记为ModifiedChangeObjectState用于更改附加实体的状态 - 它不会执行任何其他操作。调用Attach会将实体附加到Unchanged状态,因此这就是为什么必须更改状态以使更改保留在数据库中的原因..
  2. 是的,您可以在单一方法中组合附加和设置状态。只需要确保您只为每个实体调用此方法一次。附加具有相同Id两次的实体将抛出异常。