InvalidOperation в сгенерированном вспомогательном методе T4 SelfTrackingModel.Context.Extensions - PullRequest
2 голосов
/ 26 января 2012

У меня есть проект, в соответствии с которым я использую STE (EF4.1), и я сталкиваюсь с воспроизводимой проблемой, когда вызываю автоматически сгенерированный метод ApplyChanges () для одного из моих наборов объектов, передавая граф объекта, который у меня естьхранится в памяти, и я получаю следующую ошибку:

InvalidOperationException: 
    Collection was modified; enumeration operation may not execute.

Это происходит из-за вызова метода ObjectContext.AddObject (), который вызывается автоматически сгенерированным методом T4 ApplyChanges (),Мой метод вызова ApplyChanges выглядит примерно так:

// Extension to auto generated Session : IObjectWithChangeTracker
public partial class Session
{
    public void SaveToDatabase(String myConnectionString)
    { 
        using (MyContext DbContext = new MyContext(myConnectionString))
        {
            DbContext.Sessions.ApplyChanges(this);
            DbContext.SaveChanges();
        }
    }
}

Стек вызовов при обнаружении ошибки выглядит примерно так:

at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
at System.Collections.Generic.List`1.Enumerator.MoveNext()
at System.Data.Objects.DataClasses.RelatedEnd.WalkObjectGraphToIncludeAllRelatedEntities(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.RelatedEnd.AddGraphToObjectStateManager(IEntityWrapper wrappedEntity, Boolean relationshipAlreadyExists, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.EntityReference`1.Include(Boolean addRelationshipAsUnchanged, Boolean doAttach)
... // The below 4 lines are pretty much repeated as it iterates through the object graph
at System.Data.Objects.DataClasses.RelatedEnd.WalkObjectGraphToIncludeAllRelatedEntities(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.RelatedEnd.AddGraphToObjectStateManager(IEntityWrapper wrappedEntity, Boolean relationshipAlreadyExists, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.EntityCollection`1.Include(Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.RelatedEnd.WalkObjectGraphToIncludeAllRelatedEntities(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.RelatedEnd.AddGraphToObjectStateManager(IEntityWrapper wrappedEntity, Boolean relationshipAlreadyExists, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.EntityReference`1.Include(Boolean addRelationshipAsUnchanged, Boolean doAttach)
at System.Data.Objects.DataClasses.RelationshipManager.AddRelatedEntitiesToObjectStateManager(Boolean doAttach)
at System.Data.Objects.ObjectContext.AddObject(String entitySetName, Object entity)
at MyNamespace.SelfTrackingEntitiesContextExtensions.AddHelper.AddAllEntities(ObjectContext context, String entitySetName, IObjectWithChangeTracker entity)
at MyNamespace.SelfTrackingEntitiesContextExtensions.ApplyChanges[TEntity](ObjectContext context, String entitySetName, TEntity entity)
at MyNamespace.SelfTrackingEntitiesContextExtensions.ApplyChanges[TEntity](ObjectSet`1 objectSet, TEntity entity) 
at MyNamespace.Transaction.SaveToDatabase(String transactionDbConnectionString)

Я не изменяю граф объектов ввсе, пока идет операция, так что я действительно озадачен вопросом.У кого-нибудь есть идеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 01 марта 2013

Была такая же проблема. Похоже, ошибка, исправленная в .net 4.5.

0 голосов
/ 29 марта 2012

У нас была такая же проблема. Мы могли бы решить эту проблему, удалив свойства навигации, чтобы они не могли работать по кругу. Поэтому, если A имеет B в качестве свойства навигации, B не должно иметь A в качестве свойства навигации. Это невозможно при любых обстоятельствах, но в нашем случае это решило проблему.

...