如何从实体框架上下文去附着的实体? [英] How to de-attach an entity from a Context in Entity Framework?

查看:152
本文介绍了如何从实体框架上下文去附着的实体?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用EF 4.1库和的DbContext .. POCO用T4模板。
对于每一个库我使用一个单独的DbContext。

我需要更新的对象,具有相关性,在现阶段,我收到此错误

 的实体对象不能由IEntityChangeTracker的多个实例被引用。

我想我的问题是怎么一回事,因为是eventObj 候选人从不同的存储库中创建的。

所以我想解决这个code中的问题,但没有成功。

我的问题?


  • 如何摆脱这种错误的?

  • 时,可以从上下文中删除候选人?

     公共无效UpdateAddingCandidate(事件是eventObj,候选人人选){
        事件updatedEvent =新事件();
        候选updatedCandidate =新的候选();
        updatedEvent =是eventObj;
        updatedCandidate =候选人;
        updatedEvent.Candidate = updatedCandidate;
        db.Entry(updatedEvent).STATE = EntityState.Modified;
    }


修改

 公共无效UpdateAddingCandidate(事件是eventObj,候选人人选)
    {
        / *
        db.Events.AsNoTracking();
        db.Candidates.AsNoTracking();
        * /
        db.Entry(是eventObj).STATE = EntityState.Detached;
        db.Entry(候选人).STATE = EntityState.Detached;        事件updatedEvent =新事件();
        候选updatedCandidate =新的候选();
        updatedEvent =是eventObj;
        updatedCandidate =候选人;
        updatedEvent.Candidate = updatedCandidate;
        db.Entry(updatedEvent).STATE = EntityState.Detached;
        db.Entry(updatedEvent).STATE = EntityState.Modified;    }


解决方案

当你试图更新的实体连接到不同的ObjectContext比​​您正在使用更新它的背景下这种错误确实抛出。只有一个ObjectContext的可跟踪实体

您可以分离对象从它的背景下,通过调用:

,其中上下文是实体当前被附加到上下文

 使用(VAR上下文=新UnicornsContext())
{
    VAR麒麟=新麒麟{名称=永邦,PrincessId = 1};
    context.Entry(麒麟).STATE = EntityState.Detached;
    context.SaveChanges();
}

<一个href=\"http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx\" rel=\"nofollow\">http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx

而在你实现:

 公共无效UpdateAddingCandidate(事件是eventObj,候选人人选)
{
    db.Entry(候选人).STATE = EntityState.Detached;
    db.SaveChanges();    eventObj.Candidate =候选人;
    db.Entry(是eventObj).STATE = EntityState.Modified;
    db.SaveChanges();
}

I use EF 4.1 with Repository and DbContext.. POCO with T4 template. For every Repository I use a separate DbContext.

I need to update an object with has a related property, at the moment I receive this error

An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

I suppose my problem is beacuse eventObj and candidate are created from different Repositories.

So i'm trying to solve the problem with this code, with no success.

My question?

  • How do I get rid of this error?
  • Is is possible remove the candidate from its context?

    public void UpdateAddingCandidate(Event eventObj, Candidate candidate){
        Event updatedEvent = new Event();
        Candidate updatedCandidate = new Candidate();
        updatedEvent = eventObj;
        updatedCandidate = candidate;
        updatedEvent.Candidate = updatedCandidate;
        db.Entry(updatedEvent).State = EntityState.Modified;     
    }
    

EDIT

    public void UpdateAddingCandidate(Event eventObj, Candidate candidate)
    {
        /*
        db.Events.AsNoTracking();
        db.Candidates.AsNoTracking();
        */
        db.Entry(eventObj).State = EntityState.Detached;
        db.Entry(candidate).State = EntityState.Detached;

        Event updatedEvent = new Event();
        Candidate updatedCandidate = new Candidate();
        updatedEvent = eventObj;
        updatedCandidate = candidate;
        updatedEvent.Candidate = updatedCandidate;
        db.Entry(updatedEvent).State = EntityState.Detached;
        db.Entry(updatedEvent).State = EntityState.Modified;

    }

解决方案

This error is indeed thrown when the entity you're trying to update is attached to a different objectcontext than the context you're using to update it. Only one objectcontext can track an entity

You can detach objects from it's context by calling:

where context is the context the entity currently is attached to.

using (var context = new UnicornsContext())
{
    var unicorn = new Unicorn { Name = "Franky", PrincessId = 1};
    context.Entry(unicorn).State = EntityState.Detached;
    context.SaveChanges();
}

http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx

And in your implementation:

public void UpdateAddingCandidate(Event eventObj, Candidate candidate)
{
    db.Entry(candidate).State = EntityState.Detached;
    db.SaveChanges();

    eventObj.Candidate = candidate;
    db.Entry(eventObj).State = EntityState.Modified;
    db.SaveChanges();
}

这篇关于如何从实体框架上下文去附着的实体?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆