我创建了几个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属性,但是我失去了双向关系,这是我想要的特定实体...
答案 0 :(得分:0)
避免在数据交换中进行n级递归,因为反序列化会出现问题(可能导致堆栈溢出)。 考虑展平您的DTO结构。您可以在没有递归的情况下对父母和孩子之间的关系进行建模。
或者,尝试确定需要支持的最大递归级别,并在DTO结构中明确建模。