2015-07-20 101 views
0

我在Odata v4客戶端中使用Odata WebApi.2.1服務。DataServiceContext:更新導航集合屬性

當我嘗試更新的實體,並且我得到以下錯誤:

我有下面的代碼在我的應用「UpdateRelatedObject方法只有當在SourceProperty不是作品集」。

public class Customer 
{ 
    int CustomerId; 
    string CustomerName; 
    ICollection<Order> Orders; 
} 


    public void Save() 
    { 
     foreach (var item in Customer.Orders) 
     { 
      Context.UpdateRelatedObject(Customer, "Orders", item); 
     } 

     Context.UpdateObject(Customer); 
     Context.SaveChanges(); 
    } 

這裏,「訂單」是Customer類的導航屬性。我該如何解決這個問題?

回答

1

拉胡爾

基本上有兩條規則:

  1. 它是無效的任何非集合值導航屬性。
  2. 這是無效的把/補丁任何集合值的導航屬性。

OData客戶端中的public api UpdateRelatedObject旨在更新非收集屬性。在其開放源碼的,也有作爲代碼:

public void UpdateRelatedObject(object source, string sourceProperty, object target) 
{ 
    ... 
    ClientPropertyAnnotation property = parentType.GetProperty(sourceProperty, false); 
    if (property.IsKnownType || property.IsEntityCollection) 
    { 
    throw Error.InvalidOperation(Strings.Context_UpdateRelatedObjectNonCollectionOnly); 
    } 
    ... 
} 

所以,你的錯誤消息在上面throw聲明拋出。

通常情況下,你可以做如下,以使其工作:

  1. 查詢的相關訂單,例如:GET〜/客戶(2)/令(1)
  2. 修改返回的訂單對象
  3. 更新修改才能稱之爲:UpdateObject

希望它可以幫助你。謝謝。

+0

感謝Sam,順便說一句我需要在WPF Datagrid中綁定訂單集合。由於獲取每個相關訂單的限制。有沒有辦法將訂單集合的實體狀態修改爲客戶端中的「更改」狀態? – Rahul

+0

你可以調用下面的公共API: public void ChangeState(object entity,EntityStates state) –

+0

Sam,我怎樣才能調用ChangeState()方法。你能給一個示例代碼嗎? – Rahul