2016-02-24 2 views
0

У меня есть контроллер 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.

Я могу сериализовать объект в строку, передать его как строку в контроллер и затем десериализовать его внутри элемента управления.
Это работает, но я надеюсь, что есть лучший способ.

ответ

0

Вы можете сделать что-то вроде этого: DataServiceCollection coll = new DataServiceCollection (context.People.Expand ("Photo"). Где (p => p.UserName == "russellwhyte")); coll.First(). Photo.Name = "test"; coll.First(). LastName = "test";
context.SaveChanges(); Сообщите мне, если это не решит проблему.

+1

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

+0

Ответ, который у вас выше, отлично зарекомендовал себя, за исключением того, что он в основном называет 2 отдельных контроллера, поэтому, похоже, нет возможности объединить их в транзакцию, как я могу, если она вызвала только контроллер/метод. Ваш второй вариант «BatchWithSingleChangeset» выглядит очень многообещающим для транзакций, за исключением того, что он не работает с реализацией по умолчанию «PATCH», которая является тем, что вызывается из кода клиента OData .net при вызове context.SaveChanges ... – goroth

+0

На самом деле ваш «BatchWithSingleChangeset» «работает в типовом проекте, но не работает в моем проекте. Я отправлю это как новый вопрос. – goroth