Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 强制EF 4.1代码首先查看已修改的附着实体_Entity Framework_Code First - Fatal编程技术网

Entity framework 强制EF 4.1代码首先查看已修改的附着实体

Entity framework 强制EF 4.1代码首先查看已修改的附着实体,entity-framework,code-first,Entity Framework,Code First,我发现的所有示例都引用了一个名为ObjectContext的类,该类在CTP5中似乎不存在。我必须强调的是,CTP5是我第一次接触实体框架 我有一个连接到DbContext的已断开连接的POCO。但是SaveChanges并没有接收到更改,我如何告诉我的上下文更新该实体 _context.Users.Attach(user); // The user has been replaced. _context.SaveChanges(); // The change is not saved. 我

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

我有一个连接到DbContext的已断开连接的POCO。但是SaveChanges并没有接收到更改,我如何告诉我的上下文更新该实体

_context.Users.Attach(user);
// The user has been replaced.
_context.SaveChanges();
// The change is not saved.
我做错了什么

2011年1月12日更新 对大多数人来说可能是显而易见的,但作为EF的第一次用户,我没有想到附加一个已经附加的对象会清除以前的状态。这让我很痛苦。但是我想以一种非常通用的方式使用Repository模式,这种方式不关心对象是否已经附加或是由于ASP.NET MVC绑定而新创建的。所以我需要一个
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
。如果对象已连接,您将受益于对象的先前状态,这反过来将允许对数据库进行优化更新。但是,如果对象未附着,该方法将强制整个对象变脏

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

Rich

附加实体时,它将变为未更改状态(自附加到上下文后,它一直未更改)。您只需将实体状态显式更改为“已修改”:


为完整起见,您可以通过将DbContext强制转换为IOObjectContextAdapter来访问ObjectContext:

((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.ChangeObjectState(user, EntityState.Modified);

Morteza的方法更简洁,并且得到了我的投票。

我相信在调用修改之前不需要附加实体。只需将设置为“修改”即可完成此工作

if (_context.Entry(user).State == EntityState.Detached)
{
    _context.Entry(user).State = EntityState.Modified;
}

太好了,谢谢。对于所有不知道的人,EntityState可以在System.Data.Entity DLL中找到。没问题,很高兴它有帮助:)天哪,我真是太感谢你了。两天来我一直在想这个问题。谢谢你,我想我错过了一些明显的东西。
if (_context.Entry(user).State == EntityState.Detached)
{
    _context.Entry(user).State = EntityState.Modified;
}