I have a MVVM project. For the model I use a EF6.0.0 code first and WebApi.
In general everything works fine but for one thing.
When I do a delete the following URL is composed
http://localhost:50346/Recruiters/Addresses(guid'5d778c9d-56b2-449b-b655-22489e01636d')/CIP.Models.Domain.Addresses
and this results in a 404 error.
So I've created an routing convention like this:
using Microsoft.Data.Edm; using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; using System.Net.Http; using System.Web; using System.Web.Http.Controllers; using System.Web.Http.OData.Routing; using System.Web.Http.OData.Routing.Conventions; namespace CIP { public class AddressesRoutingConvention : EntitySetRoutingConvention { public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap) { if (odataPath.PathTemplate == "~/entityset/key/cast") { HttpMethod httpMethod = controllerContext.Request.Method; string httpMethodName; switch (httpMethod.ToString().ToUpperInvariant()) { case "DELETE": httpMethodName = "Delete"; break; default: return null; } Contract.Assert(httpMethodName != null); IEdmEntityType entityType = odataPath.EdmType as IEdmEntityType; string actionName = httpMethodName + entityType.Name; if (actionName != null) { KeyValuePathSegment keyValueSegment = odataPath.Segments[1] as KeyValuePathSegment; controllerContext.RouteData.Values[ODataRouteConstants.Key] = keyValueSegment.Value; return actionName; } } // Not a match return null; } } }
and added this route
var conventions = ODataRoutingConventions.CreateDefault(); conventions.Insert(0, new AddressesRoutingConvention()); config.Routes.MapODataRoute("Addresses", "Addresses", addressesBuilder.GetEdmModel(), new DefaultODataPathHandler(), conventions);`
And in the controller
public async Task<IHttpActionResult> DeleteAddresses([FromODataUri] Guid key) { Addresses addresses = await db.Addresses.FindAsync(key); if (addresses == null) { return NotFound(); } db.Addresses.Remove(addresses); await db.SaveChangesAsync(); return StatusCode(HttpStatusCode.NoContent); }
But still I get the 404 error.
I tried testing it from SOAPUI with the same result.
Am I missing something?
Kind regards
Jeroen