ObjectSet.ApplyCurrentValues v/s StateManager.ChangeObjectState

发布于 2024-11-08 17:40:13 字数 1091 浏览 2 评论 0原文

我对实体框架 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 进行数据绑定,该 UpdateMethod="UpdateStore" 仅采用一个参数,如下...

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

我在这里遇到了几个问题:

  1. 当我看到 < 的文档时a href="http://msdn.microsoft.com/en-us/library/bb896271.aspx" rel="nofollow">ApplyCurrentValues,它证明我应该使用这个更新值,但这不起作用(正如您在上面的注释行中看到的那样)。然后,当我尝试使用 ObjectStateManager.ChangeObjectState 时,它​​起作用了。这两种方法有什么区别。

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

I am quite new to Entity Framework 4.1. I am starting to write a new application using EF as my DAL. I am using POCO classes (using POCO t4 template) with database first approach.

My GenericRepository has got below Update method

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

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

I having a gridview which is databind to ObjectDataSource having UpdateMethod="UpdateStore" which takes only one parameter is as follows...

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

I got couple of question here:

  1. When I see the documentation for ApplyCurrentValues, it proves me that I should use this to update values but this doesn't work (as you can see in above commented line). Then when I try with ObjectStateManager.ChangeObjectState, it works. What's the difference between this two approaches.

  2. As you can see, I attach first and then apply the update method. Can I combine attach and updating state inside my GenericRepository update method. Is there any pitfall there in doing so?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

多情出卖 2024-11-15 17:40:13
  1. 当您已附加从数据库加载的实体并且想要更新从 ObjectDataSource 接收的分离实体的值时,请使用 ApplyCurrentChanges。当您执行此操作时,所有新值都会复制到附加实体,并自动标记为已修改ChangeObjectState 用于更改附加实体的状态 - 它不执行任何其他操作。调用 Attach 会附加处于 Unchanged 状态的实体,因此这就是为什么您必须更改状态才能将更改保留在数据库中的原因。
  2. 是的,您可以将附加和设置状态结合起来在单一方法中。只需确保每个实体仅调用此方法一次。两次附加具有相同Id的实体将会抛出异常。
  1. ApplyCurrentChanges is used when you have attached entity loaded from the database and you want to update its values from detached entity received from your ObjectDataSource. When you do this all new values are copied to attached entity and it is automatically marked as Modified. ChangeObjectState is used to change state of attached entity - it does nothing else. Calling Attach attaches entity in Unchanged state so it is the reason why you must change the state to get your changes persisted in the database..
  2. Yes you can combine attaching and setting state in the single method. Just need to make sure that you will call this method only once for each entity. Attaching entity with the same Id twice will throw exception.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文