2010-11-25 66 views
0

我有一个实体CustomerActivityReport,我试图通过WCF将其提交给服务器。在服务器端,我使用repository + UOW模式来更新/插入实体到数据库中。尝试通过WCF提交EF4实体时出现序列化错误

CustomerActivityReport与另一个实体LookupValue有多对多的关系。当我尝试提交CustomerActivityReport的实例时,DataContractSerializer将引发错误:“类型为'FixupCollection [CustomerActivityReport]'的对象图包含周期,如果禁用参考跟踪,则无法序列化”。即使我没有在LookupValue实体上设置关系,我也会收到此错误。

为了解决这个问题,我尝试了将[DataContract(IsReference = true)]应用到有问题的实体以及FixupCollection中。但后来我遇到了不同的问题。

尝试通过WCF提交相关实体时是否有其他人遇到类似问题?

在此先感谢您的答复。

Ryan

回答

0

我无法使用FixupCollection工作,所以我必须将所有实体集合提交为标准Collection,然后添加逻辑服务器端以将它们更改回FixupCollection。

客户:

convertedCustomerActivityReport.LookupValues = new Collection<LookupValue>() 

服务器:

public virtual ICollection<LookupValue> LookupValues 
    { 
     get 
     { 
      if (_lookupValues == null || _lookupValues is Array) 
      { 
       var newCollection = new FixupCollection<LookupValue>(); 
       newCollection.CollectionChanged += FixupLookupValues; 
       newCollection.AddRange(_lookupValues); 
       _lookupValues = newCollection; 
      } 
      return _lookupValues; 
     } 

我还添加了一个的AddRange方法FixupCollection:

/// <summary> 
    /// Adds multiple items. 
    /// </summary> 
    /// <param name="items">The items to add.</param> 
    public void AddRange(IEnumerable<T> items) 
    { 
     if (items == null) 
     { 
      return; 
     } 

     foreach (var item in items) 
     { 
      this.Add(item); 
     } 
    } 
0

我们遇到过类似问题的时候,我们在子对象上缺少一个属性。

相关问题