【问题标题】:Problem with UPDATE Operation On Entity Framework 4 (Pure POCOs)实体框架 4(纯 POCO)上的更新操作问题
【发布时间】:2011-04-30 13:17:17
【问题描述】:

我有一个用纯 POCO 实现的 Entity Framework 4.0 模型(没有代码生成,没有自跟踪实体,只是普通的旧 CLR 对象)。

现在,我的 UI 中有一些代码用于执行 UPDATE:

[HttpPost]
public ActionResult UpdatePerson(Person person)
{
    repository.Attach(person);
    unitOfWork.Commit();
}

基本上,我有一个接受强类型 Person 对象的操作方法,我需要更新这个实体。

不会出错,但也不会将更改持久化到数据库中。 :(

当我在工作单元的“提交”期间检查 EntityState 时:

var entities = ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified | EntityState.Unchanged);

我看到了我的实体,带有 EntityState.Unchanged

这就解释了为什么它没有被持久化。我的查找、添加、删除操作工作正常(正确保留)。但 UPDATE 似乎不起作用。

我发现一些线程说我需要手动设置对象状态:

ctx.ObjectStateManager.ChangeObjectState(person, EntityState.Modified);

正确吗?我会把这个逻辑放在哪里?公开为我的工作单元上的操作?

显然,由于使用了 Pure POCO(没有 EntityObject 派生,没有 INotifyPropertyChanging 实现),我没有任何更改跟踪

但是直到现在我还没有发现它的问题。

我做错了什么?

【问题讨论】:

    标签: c# asp.net-mvc-2 entity-framework-4 poco objectstatemanager


    【解决方案1】:

    好吧,既然您没有任何更改跟踪等,EF 应该有一种方法可以在调用 SaveChanges() 时确定如何处理附加的实体。默认情况下,EntityState 是 Unchanged,所以如果要更新,必须手动设置状态。

    另一种方法是使用此 ID 查询 Person,使用从控制器获取的数据重写属性,然后调用 SaveChanges()。这实际上是一种更安全的方式,因为您可以保护自己免受用户在编辑 web 表单时删除 Person 的情况;但这显然需要额外往返数据库,而这通常不太理想。

    无论如何,我都会有一个存储库Update() 方法(比Attach 更具体),它实际上会附加实体并将EntityState 更改为Modified。而且你的 Action 中仍然有相对干净的代码:

    public ActionResult UpdatePerson(Person person)
    {
        repository.Update(person);
        unitOfWork.Commit();
    }
    

    【讨论】:

    • 是的,我真的不想多做一次往返。所以我们必须手动设置EntityState(正如我预测的那样)。酷,谢谢。另外——我在想——有没有办法让“更新”方法足够聪明地判断它是更新还是插入? (即检查PersonId,如果它> 0,它是一个UPDATE,否则是一个INSERT?)或者这太疯狂/太可怕了。如果一种方法可以同时处理这两种情况,那就太好了。可能吗?
    • 据我了解,您正在谈论您要创建的Update() 方法,因此您可以让它变得像您想要的那样聪明;)例如附加实体,然后检查if (Person.Id == 0) { /* change state to Added */ } else { /* Change state to Modified */ }。不过,我不确定这是个好主意。具有单独的插入和更新方法通常更具可读性。为什么要将它们合并为一个?
    • 因为我使用的是MVC,并且添加/修改Person实体的操作是一样的(HTTP POST,通过强类型对象)。所以我无法知道它是添加还是更新(当然,我可以通过一个额外的标志)。不过我同意,我会将它们分开,可能必须通过 HTTP POST 中的隐藏字段,说明它是添加/更新。谢谢
    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2011-10-21
    • 2011-08-11
    相关资源
    最近更新 更多