Обновляются ли свойства отношений Entity Framework? - PullRequest
1 голос
/ 02 мая 2011

У меня есть некоторый код, подобный этому, в веб-методе WCF,

    List<LocationInRoad> locationInRoad = new List<LocationInRoad>();

    foreach (CarWorkLocationLink locationLink in source.CarWorkLocationLinks)
    {
         locationInRoad.Add(LocationInRoadMapper.MapTo(locationLink.CarWorkLocationType.WorkLocationTypeID));
    }

    destination.LocationInRoad = locationInRoad.ToArray();

Иногда (возможно, один раз в неделю) при производстве возникает ошибка,

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

Так что, похоже,говорите мне, что коллекция 'source.CarWorkLocationLinks' была изменена частично путем перечисления списка в цикле foreach.

Таким образом, для объяснения, "источник" является сущностью структуры сущности, загруженной из нашей базы данных, и 'CarWorkLocationLinks'определяется для этой сущности следующим образом:

    [XmlIgnoreAttribute()]
    [SoapIgnoreAttribute()]
    [DataMemberAttribute()]
    [EdmRelationshipNavigationPropertyAttribute("CarManagerModel", "FK_CarWorkLocationLink_CarDetail", "CarWorkLocationLink")]
    public EntityCollection<CarWorkLocationLink> CarWorkLocationLinks
    {
        get
        {
            return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<CarWorkLocationLink>("CarManagerModel.FK_CarWorkLocationLink_CarDetail", "CarWorkLocationLink");
        }
        set
        {
            if ((value != null))
            {
                ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<CarWorkLocationLink>("CarManagerModel.FK_CarWorkLocationLink_CarDetail", "CarWorkLocationLink", value);
            }
        }
    }

Т.е. это отношение сущности к другой таблице.Поэтому я предполагаю, что вопрос заключается в том, можно ли изменить EntityCollection после его загрузки, если что-то в базе данных изменится?

Таким образом, в целом приведенный выше код вписывается в вызов WCF, например,

public APIEntity WCFCall(parameters)
{
    using (EntityContext context = new EntityContext())
    {
        // loading entity (database entity that is)
        // creating API entity (this is a POCO object to control what is exposed over the WCF service)
        // running the loop as shown above on the 'loaded entity' and popluating fields in the poco object
        // returning the poco object
    }
}

Так что я не уверен, почему упомянутая ошибка должна возникать.Является самодостаточным.

1 Ответ

1 голос
/ 02 мая 2011

Если вы используете общий контекст (вы не создаете ObjectContex для запроса / единицы работы), тогда ответ да, и объяснение здесь - ObjectContext создает для каждой записи, идентифицированной В первичном ключе только один экземпляр объекта, и этот экземпляр повторно используется для каждого последующего запроса (он называется шаблоном карты идентичности). Поэтому, если вы используете общий контекст и у вас есть многопоточное приложение (например, веб-сервис, asp.net и т. Д.), Все потоки могут одновременно использовать один и тот же экземпляр сущности и изменять одну и ту же коллекцию связанных объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...