2017-04-06 33 views
0

我在我的实体内部的一个方法中创建一个上下文来检查某些东西,但我没有跟踪任何东西,但是当我尝试保存在调用代码上下文中时,它会引发异常。实体附加到上下文并且无法删除它

这是主要的背景下调用代码,我要保存:

var espToProcess = db.RootDomainEmailSeriesProgresses; 

foreach (var esp in espToProcess) 
{ 
    bool carryOn = esp.MoveNext(); 
    db.SaveChanges(); //Exception 
    if (!carryOn) continue; 

    //--> rest of my code 
} 

这是RootDomainEmailSeriesProgress类中的方法。

public bool MoveNext() 
{ 
    if (this.CompletedTargets == null) this.CompletedTargets = new List<EmailAddress>(); 

    if (this.CurrentTarget != null) 
    { 
     this.CompletedTargets.Add(this.CurrentTarget); 
     this.CurrentTarget = null; 
    } 
    this.CurrentProgress = ""; 

    if (this.RootDomain.ContactFilter != RootDomain.ContactFilterType.None) 
    { 
     this.Status = EmailSeriesStatus.Aborted; 
     return false; 
    } 

    var allTargets = RootDomainEmailManager.SortDomainsEmailsByDesirability(this.RootDomain.ID); 
    var toDo = allTargets.Except(this.CompletedTargets); 
    if (toDo.Count() < 1) 
    { 
     this.Status = EmailSeriesStatus.Completed; 
     return false; 
    } 

    List<string> targetEmailList = allTargets.Select(e => e.Email).ToList(); 
    List<EmailFilter> emailFilters = this.GetFilters(allTargets); 

    if (emailFilters.Any(x => x.Filter == EmailFilterType.Unsubscribe || x.Filter == EmailFilterType.Responded || x.Filter == EmailFilterType.ManualContactOnly)) 
    { 
     this.Status = EmailSeriesStatus.Aborted; 
     if (this.RootDomain.ContactFilter == 0) this.RootDomain.ContactFilter = RootDomain.ContactFilterType.HasAssociatedEmailFilter; 
     return false; 
    } 

    this.CurrentTarget = toDo.First(); 

    return true; 

} 

private List<EmailFilter> GetFilters(List<EmailAddress> allTargets) 
{ 
    using (var db = new PlaceDBContext()) 
    { 
     db.Configuration.AutoDetectChangesEnabled = false; 
     db.Configuration.LazyLoadingEnabled = false; 

     var targetEmailList = allTargets.Select(e => e.Email).ToList(); 
     return db.EmailFilters.AsNoTracking().Where(x => targetEmailList.Contains(x.Email)).ToList(); 

    } 
} 

它抛出该异常:

两个对象之间的关系不能被限定,因为它们连接到不同的ObjectContext对象。

我看不出为什么esp被连接到另一个上下文。我只是简单地需要这个背景,我如何将它关闭以免它导致我遇到问题?

回答

0

,由于有差别的DbContext在foreach循环和GetFilters实例方法

您可以重试此代码

var espToProcess = db.RootDomainEmailSeriesProgresses; 

foreach (var esp in espToProcess) 
{ 
    bool carryOn = esp.MoveNext(db); 
    db.SaveChanges(); //Exception 
    if (!carryOn) continue; 

    //--> rest of my code 
} 


public bool MoveNext(DbContext db) 
{ 
    if (this.CompletedTargets == null) this.CompletedTargets = new 
List<EmailAddress>(); 

    if (this.CurrentTarget != null) 
    { 
     this.CompletedTargets.Add(this.CurrentTarget); 
     this.CurrentTarget = null; 
    } 
    this.CurrentProgress = ""; 

    if (this.RootDomain.ContactFilter != RootDomain.ContactFilterType.None) 
    { 
     this.Status = EmailSeriesStatus.Aborted; 
     return false; 
    } 

    var allTargets = 
RootDomainEmailManager.SortDomainsEmailsByDesirability(this.RootDomain.ID); 
    var toDo = allTargets.Except(this.CompletedTargets); 
    if (toDo.Count() < 1) 
    { 
     this.Status = EmailSeriesStatus.Completed; 
     return false; 
    } 

    List<string> targetEmailList = allTargets.Select(e => e.Email).ToList(); 
    List<EmailFilter> emailFilters = this.GetFilters(allTargets, db); 

    if (emailFilters.Any(x => x.Filter == EmailFilterType.Unsubscribe || 
x.Filter == EmailFilterType.Responded || x.Filter == 
EmailFilterType.ManualContactOnly)) 
    { 
     this.Status = EmailSeriesStatus.Aborted; 
     if (this.RootDomain.ContactFilter == 0) 
this.RootDomain.ContactFilter = 
RootDomain.ContactFilterType.HasAssociatedEmailFilter; 
     return false; 
    } 

    this.CurrentTarget = toDo.First(); 

    return true; 

} 

private List<EmailFilter> GetFilters(List<EmailAddress> allTargets, DbContext db) 
{ 
    db.Configuration.AutoDetectChangesEnabled = false; 
    db.Configuration.LazyLoadingEnabled = false; 

    var targetEmailList = allTargets.Select(e => e.Email).ToList(); 
    return db.EmailFilters.AsNoTracking().Where(x => 
targetEmailList.Contains(x.Email)).ToList(); 

}

+0

我得到同样的错误 – Guerrilla

相关问题