Estoy tratando de implementar lo que pensé que era un escenario simple utilizando un servicio OData proporcionado por los servicios de datos WCF (utilizando la aplicación OData V3/json; odata = formato de carga prolija, por ahora. Puedo usar el formato JSON Light en futuro). El escenario básico dice así:¿Cómo actualizo una entidad OData y modifico sus propiedades de navegación en una sola solicitud?
Tengo dos entidades:
class Person
{
public int ID { get; set; }
public string Name { get; set; }
public virtual PersonCategory Category { get; set; }
}
class PersonCategory
{
public int ID { get; set; }
public string Description { get; set; }
public virtual ICollection<Person> People { get; set; }
}
Ahora, quiero crear una simple página de edición para una persona. Esta página de edición puede tener una entrada para el Nombre y una entrada o menú desplegable para la Categoría de la Persona.
Por lo tanto, el escenario va:
- Código descargas de la persona que utiliza $ ampliar para la Categoría: GET /api.svc/People(1)?$expand=Category
- usuario edita tanto en la persona de Nombre de la propiedad y su categoría.
- El código de la página realiza una única solicitud para actualizar las propiedades de nombre y categoría de esa persona.
La clave aquí está en "una sola solicitud". Esta es la parte que me cuesta encontrar documentación. He visto ejemplos en los que dividieron el número 3 anterior en dos solicitudes. Algo como esto (no recuerdo el formato exacto - Tampoco estoy seguro de si habría que eliminar el enlace antes de hacer la Categoría PUT):
PATCH /api.svc/People(1) with content: {"Name": "new name" }
PUT /api.svc/People(1)/$links/Category with content: { "url": "/api.svc/Categories(2)" }
Pero, también he oído dicho, pero no demostrado, que es posible implementar esta actualización como una única solicitud con el cambio a la propiedad de navegación Categoría especificada en línea con los otros cambios a la entidad Persona. ¿Podría alguien darme un ejemplo de cómo se podría hacer esto? Además, ¿puede mostrarme cómo se haría con una propiedad de navegación de muchos a muchos, en lugar de la opción de uno a muchos que he descrito anteriormente?
Y, por último, actualmente estoy usando el formato JSON detallado, V3. ¿Sus respuestas a las preguntas anteriores serían diferentes si en su lugar utilicé el nuevo formato de luz JSON? ¿Si es así, cómo?
Puede enviar una solicitud por lotes: sería una solicitud única que contiene ambas operaciones. – Pawel
¿No hay otra manera de hacer esto que no sea una solicitud por lotes? Eso agregaría una complejidad adicional al código de disparo circular del lado del cliente que preferiría evitar. Idealmente, me gustaría simplemente formatear mi solicitud de PATCH/api/Activity (1) para que sea algo como: {"category": {"__deferred": {"uri": "/api.svc/Categories(2)"} }} Esto no parece funcionar sin embargo. Recibo una respuesta 204, pero la propiedad permanece sin cambios en el lado del servidor. –
Las denominadas actualizaciones profundas (que es lo que quiere aquí) no son compatibles con WCF Data Services. De hecho, incluso OData en sí mismo no lo define realmente. Puede ser bastante complicado en cuanto a lo que significa en algunos casos. Me temo que el lote es la única solución para esto. Inserciones profundas son compatibles (pero de nuevo solo insertos, sin modificar nada existente). –