如何从实体框架上下文去附着的实体? [英] How to de-attach an entity from a Context in Entity Framework?
问题描述
我用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();
}
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屋!