gpt4 book ai didi

c# - Entity Framework 4(纯 POCO)上的更新操作问题

转载 作者:行者123 更新时间:2023-11-30 12:36:04 25 4
gpt4 key购买 nike

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

现在,这是我的 UI 中用于执行更新:

的一些代码
[HttpPost]
public ActionResult UpdatePerson(Person person)
{
repository.Attach(person);
unitOfWork.Commit();
}

本质上,我有一个接受强类型 Person 对象的 Action Method,我需要更新这个实体。

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

当我在我的工作单元的“提交”期间检查 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 实现),我没有任何没有更改跟踪

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

我做错了什么?

最佳答案

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

另一种方法是使用此 Id 查询 Person,用您从 Controller 获取的数据重写属性,然后调用 SaveChanges()。这实际上是一种更安全的方法,因为您可以防止在用户编辑网络表单时 Person 被删除的情况;但这显然需要额外往返数据库,这通常不太理想。

在任何情况下,我都会有一个存储库 Update() 方法(比 Attach 更具体),它实际上会附加实体并更改 EntityState 修改。而且你的 Action 中仍然有相对干净的代码:

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

关于c# - Entity Framework 4(纯 POCO)上的更新操作问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4020594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com