繁体   English   中英

UpdateRelatedObject方法仅在未收集sourceProperty时有效

[英]UpdateRelatedObject method only works when the sourceProperty is not collection

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

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

我的代码在下面提供。 当调用方法“ 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);

您实际上想要删除实体的集合值导航属性中的某些项目与其本身之间的关系。 在这种情况下,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

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

        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM