У меня есть контроллер OData V4 для «Заказов» и внутри контроллера заказов я добавил метод «SaveWithChild», который является HttpPost с параметром типа ODataActionParameters.
В WebApiConfig я добавил ActionConfiguration для «SaveWithChild» в сущности «Заказы» с типом параметра «Заказ».OData V4 client pass pass parent и child как параметр
Теперь предположим, что модель «Заказ» имеет свойство «UpdateUser», а также имеет дочернее свойство «OrderLine», а OrderLine имеет свойство «UpdateUser».
Как следующее:
class Order
{
public string UpdateUser { get; set; }
public OrderLine OrderLine { get; set; }
}
class OrderLine
{
public string UpdateUser { get; set; }
}
Теперь на стороне клиента, я хотел бы, чтобы иметь возможность обновить поле «UpdateUser» и для родительского «Заказ» и ребенка «OrderLine», вызвав " SaveWithChild "на контроллере.
var context = new Container("URI");
var order = (from o in context.Orders.Expand("OrderLine") where o.ID = 1 select o).FirstOrDefault();
order.UpdateUser = "test";
order.OrderLine.UpdateUser = "test";
context.Orders.SaveWithChild(order);
Когда я бегу Фидлер, я могу видеть, что объект «OrderLine» не передается с объектом заказа в HTTP POST JSON.
Я могу сериализовать объект в строку, передать его как строку в контроллер и затем десериализовать его внутри элемента управления.
Это работает, но я надеюсь, что есть лучший способ.
BTW, если вы не хотите использовать отслеживание свойств клиента, вы можете обновить таким образом, как это, var ppp = (от o в контексте. Люди. Expand («Фото, поездки»), где o.UserName = = "russellwhyte" выберите o) .FirstOrDefault(); var myTrip = ppp.Trips.First(); ppp.LastName = "test111"; myTrip.Name = "test1111"; context.UpdateObject (ppp); context.UpdateObject (myTrip); context.SaveChanges (SaveChangesOptions.BatchWithSingleChangeset); – Vincent
Ответ, который у вас выше, отлично зарекомендовал себя, за исключением того, что он в основном называет 2 отдельных контроллера, поэтому, похоже, нет возможности объединить их в транзакцию, как я могу, если она вызвала только контроллер/метод. Ваш второй вариант «BatchWithSingleChangeset» выглядит очень многообещающим для транзакций, за исключением того, что он не работает с реализацией по умолчанию «PATCH», которая является тем, что вызывается из кода клиента OData .net при вызове context.SaveChanges ... – goroth
На самом деле ваш «BatchWithSingleChangeset» «работает в типовом проекте, но не работает в моем проекте. Я отправлю это как новый вопрос. – goroth