2011-12-24 6 views
2

私は、RESTサービスとEF4を作成するためにWCF WebAPIを使用しています。 NavigationPropertyを持っている(POCOクラスの)オブジェクトを返しますが、私は以下のシリアル化の例外取得しています:ナビゲーションオブジェクトのコレクションを持つオブジェクトを返す際のシリアル化の問題

はタイプSystem.Collections.Generic.ICollection`1 [[モデルのメンバーModels.Customer.Ordersをシリアル化することはできません。 Order、Models、Version = 1.0.0.0、Culture =ニュートラル、PublicKeyToken = null]]を参照してください。

次のように

POCOクラスである
[Serializable] 
[DataContract(IsReference = true)] 
[KnownType(typeof(Order))] 
public partial class Customer 
{ 
    #region Primitive Properties 
    [DataMember] 
    public virtual int CustomerID { get; set; } 

    [DataMember] 
    public virtual string CustomerCode { get; set; } 

    [DataMember] 
    public virtual string Description { get; set; } 

    [DataMember] 
    public virtual string Comments { get; set; } 

    [DataMember] 
    public virtual bool DeleteFlag { get; set; } 

    [DataMember] 
    public virtual byte[] RowVersion { get; set; } 
    #endregion 
    #region Navigation Properties 

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

    #endregion 
    #region Association Fixup 

    private void FixupOrders(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.NewItems != null) 
     { 
      foreach (Order item in e.NewItems) 
      { 
       item.Customer = this; 
      } 
     } 

     if (e.OldItems != null) 
     { 
      foreach (Order item in e.OldItems) 
      { 
       if (ReferenceEquals(item.Customer, this)) 
       { 
        item.Customer = null; 
       } 
      } 
     } 
    } 

    #endregion 
} 

次のサービスのメソッドは次のとおりです。

[WebGet(UriTemplate = "Customer", 
     RequestFormat = WebMessageFormat.Xml, 
     ResponseFormat = WebMessageFormat.Xml)] 
public List<Customer> Get() 
{ 
    CustEntities context = new CustEntities(); 
    return context.Customer.Include("Orders").ToList(); 
} 

上記の点で任意のヘルプは非常にかなりのです。

おかげ

答えて

1

私はあなたがこのようにインターフェイスとしてプロパティをシリアル化することができないと思いますが、そうでない場合はデシリアライザは、オブジェクトが直列化復元されたときに作成するために、具体的な種類を知ることはできません。

ICollectionプロパティをList<T>のような具体的なタイプに変更できますか?

+0

EF T4テンプレートを使用してPOCOクラスを作成しています。私たちはT4テンプレートを変更したくありません。上記を達成するための回避策はありますか? – SKumars

+0

Customerクラスに '[KnownType(typeof(FixupCollection))]'を追加しようとしましたか? –

関連する問題