做实体框架关系属性更新

本文关键字:属性 更新 关系 框架 实体 | 更新日期: 2023-09-27 17:54:01

我在WCF web方法中有一些这样的代码,

    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.

所以它似乎在告诉我"来源"。通过在foreach循环中枚举列表,CarWorkLocationLinks的集合已经被修改了一部分。

解释一下,'source'是一个从数据库加载的实体框架实体'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
    }
}

所以我不确定为什么我提到的错误应该发生。

做实体框架关系属性更新

如果您正在使用共享上下文(您不是为每个请求/工作单元创建ObjectContex),那么答案是肯定的,并且解释在这里- ObjectContext为每个由主键标识的记录创建一个实体实例,并且该实例被每个后续请求重用(它称为身份映射模式)。因此,如果您共享上下文,并且您有多线程应用程序(如web服务,asp.net等),所有线程都可以并发地使用相同的实体实例并修改相同的相关对象集合。