使用POCO实体和Silverlight服务的循环引用

时间:2012-02-29 16:48:20

标签: wcf windows-phone ria cyclic-reference

我创建了几个POCO实体,它们之间有关系。例如,“个人”实体与“集合”实体具有OneToMany关系。以下是我如何定义它们:

[DataContract(IsReference=true)]
[KnownType(typeof(User))]
[KnownType(typeof(Address))]
[KnownType(typeof(Collection))]
[KnownType(typeof(Donation))]
[KnownType(typeof(CollectorRating))]
[KnownType(typeof(DonatorRating))]
[Table("Individuals")]
public class Individual : User
{
    // ... Lots of attributes

    [DataMember]
    [InverseProperty("Collector")]
    public virtual ICollection<Collection> Collections { get; set; }

    // Lots of other attributes
}

收集实体:

[DataContract(IsReference=true)]
[KnownType(typeof(Individual))]
[KnownType(typeof(Organization))]
[KnownType(typeof(Donation))]
[KnownType(typeof(DeliveryDay))]
[KnownType(typeof(Address))]
[Table("Collections")]
public class Collection
{
    // Other attributes

    [DataMember]
    [InverseProperty("Collections")]
    public virtual Individual Collector { get; set; }

    // ... Attributes
}

我的服务是Silverlight兼容服务,以这种方式定义:

[ServiceContract(Namespace = "")]
[SilverlightFaultBehavior]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class IndividualService
{
    [OperationContract]
    public User GetByEmail(string email)
    {
        using (var context = new EntitiesContext())
        {
            Individual user = context.Individuals.SingleOrDefault(u => u.Email == email);

            return user;
        }
    }
}

这按预期工作:我收到一个单独的对象,其中填充了数据成员和null数组。

但是,一旦我尝试包含这种关系:

context.Individuals.Include("Collections").SingleOrDefault(u => u.Email == email)

我有一个堆栈溢出异常,这非常烦人。我很确定这是一个循环引用错误,但我尝试了每个解决方案(将IsReference = true添加到DataContract属性...)。这个唯一有效的方法是用Collection实体中的IgnoreDataMember属性替换DataMember属性,但是我失去了双向关系,这是我想要的特定实体...

1 个答案:

答案 0 :(得分:0)

避免在数据交换中进行n级递归,因为反序列化会出现问题(可能导致堆栈溢出)。 考虑展平您的DTO结构。您可以在没有递归的情况下对父母和孩子之间的关系进行建模。

或者,尝试确定需要支持的最大递归级别,并在DTO结构中明确建模。