entity-framework - 强制 EF 4.1 Code First 将附加实体视为已修改

标签 entity-framework code-first

我发现的所有示例都引用了一个名为 ObjectContext 的类,该类在 CTP5 中似乎不存在。在这一点上我必须强调,CTP5 是我第一次接触 Entity Framework 。

我有一个已连接到我的 DbContext 的断开连接的 POCO。虽然 SaveChanges 没有接受更改,但我如何告诉我的上下文来更新该实体?

_context.Users.Attach(user);
// The user has been replaced.
_context.SaveChanges();
// The change is not saved.

我究竟做错了什么?

2011 年 12 月 1 日更新
对大多数人来说可能很明显,但是作为 EF 的第一次用户,我没有想到附加一个已经附加的对象会清除以前的状态。这给我带来了很大的痛苦。但是我想以一种非常通用的方式使用存储库模式,这种方式不关心对象是否已经附加或者是由于 ASP.NET MVC 绑定(bind)而新创建的。所以我需要一个 UpdateUser方法,我附在下面。
    public User UpdateUser(User user) {
        if (_context.Entry(user).State == EntityState.Detached) {
            _context.Users.Attach(user);
            _context.Entry(user).State = EntityState.Modified;
        }
        return user;
    }

该方法显然假设对象以某种方式存在于数据存储中,它被称为 UpdateUser毕竟。如果对象已附加,您将受益于对象的先前状态,这反过来将允许对 DB 进行优化更新。但是,如果没有附加对象,该方法会强制整个对象变脏。

现在看起来很明显,以前没有。希望它可以帮助某人。

富有的

最佳答案

当您附加一个实体时,它会进入未更改状态(自从它附加到上下文后它没有被更改)。您只需将实体状态显式更改为已修改:

_context.Users.Attach(user);
_context.Entry(user).State = System.Data.Entity.EntityState.Modified;
_context.SaveChanges();

关于entity-framework - 强制 EF 4.1 Code First 将附加实体视为已修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4413872/

相关文章:

c# - Entity Framework 中的上下文中缺少 AsNoTracking() 方法

c# - 一个 View 中的 MVC 多个模型

asp.net - Entity Framework 从具有不同表关系主/外键场景的两个表中选择

asp.net-mvc - 将本地列表操作与 linq to entities 数据库操作混合

c# - 每个表只允许一个标识列

entity-framework - 如何停止 EF 检测数据库/模型的更改

c# - 扩展 POCO 类以使用其他上下文进行计算

entity-framework - 具有所需关联的 Entity Framework 4.3

asp.net-mvc - MVC 3 代码优先 ViewModel - 如何?