私は、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();
}
上記の点で任意のヘルプは非常にかなりのです。
おかげ
EF T4テンプレートを使用してPOCOクラスを作成しています。私たちはT4テンプレートを変更したくありません。上記を達成するための回避策はありますか? – SKumars
Customerクラスに '[KnownType(typeof(FixupCollection))]'を追加しようとしましたか? –