2014-11-27 5 views
1

Я получаю следующее сообщение об ошибке при попытке обновить дерево объектов с помощью asp.net WebAPI OData:метод UpdateRelatedObject работает только тогда, когда не исходный ресурс коллекция

"UpdateRelatedObject method only works when the sourceProperty is not collection." 

Моего код приведен ниже. Я получил эту ошибку, когда вызывается mehod «UpdateRelatedObject». Можете ли вы сообщить, что не так с моим кодом и как обновить дерево объектов (что означает, что объект содержит коллекцию дочерних объектов), используя asp.net webapi odata v4.

var container = new Container(new Uri("http://JohnAlbert.com/MyOdataTest/odata")); 
      Product product = container.Products.Expand(p=> p.ProductItems).Expand(p=>p.ProductInvoices).Where(p => p.PId == Guid.Parse("28C508B8-F2DC-45C2-B401-7F94E79AB347")).FirstOrDefault(); 
      if (product != null) 
      { 
       product.Name = product.Name + "_Modified"; 

       var pitem1 = product.ProductItems[0]; 
       product.ProductItems.Remove(pitem1); 
       container.UpdateRelatedObject(product, "ProductItems", pitem1); 


       var pitem2 = product.ProductItems[0]; 
       pitem2.Price = 999; 
       container.UpdateRelatedObject(product, "ProductItems", pitem1); 

       var pInv1 = product.ProductInvoices[0]; 
       product.ProductInvoices.Remove(pInv1); 
       container.UpdateRelatedObject(product, "ProductInvoices", pInv1); 

      } 
      container.UpdateObject(product); 

      container.SaveChanges(SaveChangesOptions.BatchWithSingleChangeset); 

ответ

0

То, что вы на самом деле хотите удалить связь между некоторыми элементами в коллекции многозначных навигации свойства объекта и самой себя. В этом случае метод DeleteLink() является правильным методом. В этом случае следующий код должен делать свою работу:

if (product != null) 
     { 
      var pitem1 = product.ProductItems[0]; 
      var pitem2 = product.ProductItems[0]; 
      var pInv1 = product.ProductInvoices[0]; 

      container.DeleteLink(product, "ProductItems", pitem1); 
      container.DeleteLink(product, "ProductItems", pitem2); 
      container.DeleteLink(product, "ProductInvoices", pInv1); 

      container.SaveChanges(); 
     } 

Вы можете думать, что выше способ не интуитивный, как непосредственно удаления элементов навигации от объекта, используя .Remove(), как вы делали. Для этой проблемы можно отслеживать отслеживание объектов, поддерживаемое с помощью DataServiceCollection<T>. Вы можете использовать этот пост в блоге как учебник по использованию DataServiceCollection<T>: http://blogs.msdn.com/b/odatateam/archive/2014/04/10/client-property-tracking-for-patch.aspx

0

Чтобы удалить содержащееся свойство навигации, вы можете использовать DataServiceContext.DeleteObject.

Чтобы удалить связь между субъектом и его свойства навигации, вы можете использовать DataServiceContext.DeleteLink

Чтобы обновить объект, вы можете использовать DataServiceContext.UpdateObject. Итак, в соответствии с вашим сценарием вы можете использовать следующий код

 if (product != null) 
     { 
      product.Name = product.Name + "_Modified"; 
      dsc.UpdateObject(product); 

      var pitem1 = product.ProductItems[0]; 
      //This is to remove relationship 
      container.DeleteLink(product, "ProductItems", pitem1); 
      // This is to remove the object 
      //container.DeleteObject(pitem1); 


      var pitem2 = product.ProductItems[0]; 
      pitem2.Price = 999; 
      container.UpdateObject(pitem2); 

      var pInv1 = product.ProductInvoices[0]; 
      //This is to remove relationship 
      container.DeleteLink(product, "ProductInvoices", pInv1); 
      // This is to remove the object 
      //container.DeleteObject(pInv1); 

      container.SaveChanges(SaveChangesOptions.BatchWithSingleChangeset); 

     } 
Смежные вопросы