如何使用WCF修复循环引用问题

时间:2012-11-19 15:27:46

标签: wcf entity-framework c#-4.0

我有一组规范化的表格。所有者,狗,许可证(这些是主要的)每个所有者可以有多个狗,每个狗可以有多个许可证。有一些参考表与每个对象相关联,例如所有者的地址,狗的品种和颜色以及许可证的许可证类型。我不相信这些是我的问题。

这基本上是Code First(使用逆向工程师代码优先工具)所以我没有EDMX。我有一个循环引用问题,它正在杀了我。我读过的所有文章都说只是为了放置IsReference = true属性。如果它只是一个亲子关系,这是很好的。我有祖父母 - 亲子关系。我试过this文章没有运气。我看到很多文章,但大多数都是4岁以上。我想要做什么,并在.Net 4(而不是4.5)中工作。在这种情况下,我无法成为唯一的人。我的大脑在这一点上很难。

这是我从数据库中抓取对象的代码。它就像一个冠军。

using (DogLicensingContext db = new DogLicensingContext()) {
    Result = (from l in db.Licenses
        .Include(x => x.Dog) // Get the Dog on this License
        .Include(x => x.Dog.Owner)
        .Include(x => x.Dog.Owner.Title)
        .Include(x => x.Dog.Owner.Dogs) // Gets me all of their Dogs
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.Licenses))
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.Licenses.Select(l => l.TagStyle)))
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.Breed))
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.Color))
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.Color1))
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.HairLength))
        .Include(x => x.Dog.Owner.Dogs.Select(d => d.Sex))
        .Include(x => x.Dog.Owner.Address)
        .Include(x => x.Dog.Owner.Address.State)
        .Include(x => x.Dog.Owner.Phones)
        .Include(x => x.Dog.Owner.Emails)
        .Include(x => x.Dog.Owner.Phones.Select(p => p.PhoneType))
        .Include(x => x.Dog.Owner.Emails.Select(p => p.EmailType))
    where l.BarCode == BarCode
    select l).FirstOrDefault();
} // using the database

这是所有者和狗类的精简视图。

所有者类:

[DataMember]
public Nullable<System.DateTime> UpdatedOn { get; set; }
[DataMember]
public int ID { get; set; }

public virtual ICollection<Dog> Dogs { get; private set; }

狗类:

[DataMember]
public Nullable<System.DateTime> UpdatedOn { get; set; }
[DataMember]
public int ID { get; set; }

[DataMember]
public virtual Owner Owner { get; set; }

public virtual ICollection<License> Licenses { get; set; }

它在这样的测试客户端中工作。如果我制作ICollection Dogs或ICollection许可证,DataMember就是我获得StackOverflow的时候。

那么我怎样才能让收藏品遇到WCF?

1 个答案:

答案 0 :(得分:4)

使用ReferencePreservingDataContractFormat here

然后使用属性

标记您的wcf服务方法(操作合同)
[OperationContract]
[ReferencePreservingDataContractFormat]
List<Dog> GetDogsAndOwners();