Asp.net web api UpdateRelatedObject方法仅在sourceProperty不是集合时有效

Asp.net web api UpdateRelatedObject方法仅在sourceProperty不是集合时有效,asp.net-web-api,odata,Asp.net Web Api,Odata,当我尝试使用asp.net webapi OData更新对象树时,出现以下错误: "UpdateRelatedObject method only works when the sourceProperty is not collection." 下面提供了我的代码。我在调用mehod UPDATERATEDOBJECT时遇到了这个错误。请您告知我的代码有什么问题,以及如何使用asp.net webapi odata v4更新对象树,这意味着对象包含子对象的集合 var container

当我尝试使用asp.net webapi OData更新对象树时,出现以下错误:

"UpdateRelatedObject method only works when the sourceProperty is not collection." 
下面提供了我的代码。我在调用mehod UPDATERATEDOBJECT时遇到了这个错误。请您告知我的代码有什么问题,以及如何使用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);

您实际想要删除的是实体的集合值导航属性中的某些项与实体本身之间的关系。在这种情况下,使用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启用的实体跟踪可以有所帮助。您可以使用此博客文章作为如何使用DataServiceCollection的教程:

要删除包含的导航属性,可以使用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);

        }