WCF-REST和POCO無窮迴圈的問題

15 May 2010 — Written by Sky Chang
#Entity Framework#WCF

這陣子在寫REST配合上EF4和POCO

Lazy Loading的不支援這已經不用講了....

同樣的Proxy也一樣必須關掉,

但還是碰上一個問題,

明明在除錯模式看的時候,物件裡面的值也都有,是正常的,

但實際上,打開的網頁就是一片空白。

後來終於找到相關網站如下

http://nikhilthaker86.wordpress.com/tag/wcf-rest/

翻譯後大約的意思是( 翻錯了不要打我- -)

因為在呼叫的時候,會變成Customer 取得 Orders,

然後Orders裡面又取得Customer 然後,Customer又取得Orders

變成無窮迴圈取得,使得序列化沒辦法產生出來。

目前找到的方法是使用

[IgnoreDataMember]

這個參數是將此屬性不要序列化,

但同樣也有些問題,如果將Customer的Orders屬性關掉的話,

就變成,可以從Orders取得Customer屬性,但卻無法從Customer取得Orders

P.S 解決著個問題,大概一口氣看了我這輩子最多的英文文章吧= =

[IgnoreDataMember]
public virtual ICollection<Orders> Orders
{
  get
  {
    if (_orders == null)
    {
      var newCollection = new FixupCollection<Orders>();
      newCollection.CollectionChanged += FixupOrders;
      _orders = newCollection;
    }
  return _orders;
  }
  set
  {
    if (!ReferenceEquals(_orders, value))
    {
      var previousValue = _orders as FixupCollection<Orders>;
      if (previousValue != null)
      {
        previousValue.CollectionChanged -= FixupOrders;
      }
      _orders = value;
      var newValue = value as FixupCollection<Orders>;
      if (newValue != null)
      {
        newValue.CollectionChanged += FixupOrders;
      }
    }
  }
}

private ICollection<Orders> _orders;
Sky & Study4.TW