首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dispose DbContext not dispose ObjectContext实体

Dispose DbContext not dispose ObjectContext实体
EN

Stack Overflow用户
提问于 2012-11-18 00:21:52
回答 4查看 1.6K关注 0票数 3

我正在使用EF 5.0创建一个网站,我在处理我的上下文时遇到了一些问题。我使用上下文的所有时间都在using语句中,所以上下文应该被自动处理,但在特定的时刻,当我试图将实体附加到上下文时,我得到了下一个错误:

ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同关键点的多个对象。

它表示该实体未被释放。如何管理这种情况?我是否必须处理ObjectContext来处理实体,或者有什么方法可以检查实体是否已附加?

致以问候。

EN

回答 4

Stack Overflow用户

发布于 2012-11-18 03:06:21

一种方法是在附加之前分离现有对象。我前面没有VS,所以如果代码不完全正确,我很抱歉。

代码语言:javascript
复制
var existingObject = dbContext.Users.Local
  .FirstOrDefault(x => x.id = newObject.id);

if (existingObject != null)
{
  // remove object from local cache
  dbContext.Entry(existingObject).State = EntityState.Detached;
}

dbContext.Users.Attach(newObject);

如果这不能解决问题,您将不得不使用分离对象的旧方法。

代码语言:javascript
复制
  // remove object from local cache
  ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
  objectContext.Detach(existingObject);
票数 1
EN

Stack Overflow用户

发布于 2012-11-18 01:45:36

如果你做这样的事情:

代码语言:javascript
复制
User u;
using (Entities ent = new Entities())
{
    u = ent.Users.Single(a => a.ID == 123);
}
using (Entities ent2 = new Entities())
{
    //loading the same user
    User user2 = ent2.Users.Single(a => a.ID == 123);

    //trying to attach the same object with the same key
    ent2.Attach(u);
}

然后你会得到这个错误(我还没有测试过这段代码)。

编辑:解决方案之一是更改对象的状态:

代码语言:javascript
复制
ent2.Attach(u);
ent2.ObjectStateManager.ChangeObjectState(u, EntityState.Modified);

另一种解决方案是检查实体是否已附加:

代码语言:javascript
复制
ObjectStateEntry state = null;
if(!ent2.ObjectStateManager.TryGetObjectStateEntry(((IEntityWithKey)u).EntityKey, out state))
{
    ent2.Attach(u);
}
票数 0
EN

Stack Overflow用户

发布于 2012-11-18 06:50:51

Dispose并不意味着“重置为出厂设置”。它是一种清理非托管资源的方法,如数据库连接等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13432369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档