2015-02-10 63 views
1

我正在尝试使用WebApi 2.2和EF 6.1.2与Code First模型实现Odata端点。我跟着在这里找到教程:WebAPI Odata删除动作

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v3/creating-an-odata-endpoint

的GET动词的伟大工程,以及为PUT。但是,DELETE请求会返回404错误。有关如何调试此问题的任何建议?

以下是实体,WebApiConfig和Controller的示例。

public partial class BoltLoad 
{ 
    public int Id { get; set; } 

    [StringLength(25)] 
    public string LoadNumber { get; set; } 

    public string BoltUserId { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime CompletedDate { get; set; } 

    [StringLength(50)] 
    public string PickupAttention { get; set; } 

    [StringLength(50)] 
    public string PickupLine1 { get; set; } 

    [StringLength(50)] 
    public string PickupCity { get; set; } 

    [StringLength(50)] 
    public string PickupStateProvince { get; set; } 

    [StringLength(50)] 
    public string DropAttention { get; set; } 

    [StringLength(50)] 
    public string DropLine1 { get; set; } 

    [StringLength(50)] 
    public string DropCity { get; set; } 

    [StringLength(50)] 
    public string DropStateProvince { get; set; } 

    public Guid GlobalId { get; set; } 

    [Column(TypeName = "timestamp")] 
    [MaxLength(8)] 
    [Timestamp] 
    public byte[] Version { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime CreatedOn { get; set; } 

    [StringLength(256)] 
    public string CreatedBy { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime ModifiedOn { get; set; } 

    [StringLength(256)] 
    public string ModifiedBy { get; set; } 
} 

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.EntitySet<BoltLoad>("BoltLoads"); 
     var t = config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel()); 


    } 
} 


public class BoltLoadsController : ODataController 
{ 
    private AnyWare db = new AnyWare(); 

    // GET: odata/BoltLoads 
    [EnableQuery] 
    public IQueryable<BoltLoad> GetBoltLoads() 
    { 
     return db.BoltLoads; 
    } 

    // GET: odata/BoltLoads(5) 
    [EnableQuery] 
    public SingleResult<BoltLoad> GetBoltLoad([FromODataUri] int key) 
    { 
     return SingleResult.Create(db.BoltLoads.Where(boltLoad => boltLoad.Id == key)); 
    } 

    // PUT: odata/BoltLoads(5) 
    public IHttpActionResult Put([FromODataUri] int key, Delta<BoltLoad> patch) 
    { 
     Validate(patch.GetEntity()); 

     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     BoltLoad boltLoad = db.BoltLoads.Find(key); 
     if (boltLoad == null) 
     { 
      return NotFound(); 
     } 

     patch.Put(boltLoad); 

     try 
     { 
      db.SaveChanges(); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      if (!BoltLoadExists(key)) 
      { 
       return NotFound(); 
      } 
      else 
      { 
       throw; 
      } 
     } 

     return Updated(boltLoad); 
    } 

    // POST: odata/BoltLoads 
    public IHttpActionResult Post(BoltLoad boltLoad) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     db.BoltLoads.Add(boltLoad); 
     db.SaveChanges(); 

     return Created(boltLoad); 
    } 

    // PATCH: odata/BoltLoads(5) 
    [AcceptVerbs("PATCH", "MERGE")] 
    public IHttpActionResult Patch([FromODataUri] int key, Delta<BoltLoad> patch) 
    { 
     Validate(patch.GetEntity()); 

     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     BoltLoad boltLoad = db.BoltLoads.Find(key); 
     if (boltLoad == null) 
     { 
      return NotFound(); 
     } 

     patch.Patch(boltLoad); 

     try 
     { 
      db.SaveChanges(); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      if (!BoltLoadExists(key)) 
      { 
       return NotFound(); 
      } 
      else 
      { 
       throw; 
      } 
     } 

     return Updated(boltLoad); 
    } 

    // DELETE: odata/BoltLoads(5) 

    public IHttpActionResult Delete([FromODataUri] int key) 
    { 
     BoltLoad boltLoad = db.BoltLoads.Find(key); 
     if (boltLoad == null) 
     { 
      return NotFound(); 
     } 

     db.BoltLoads.Remove(boltLoad); 
     db.SaveChanges(); 

     return StatusCode(HttpStatusCode.NoContent); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      db.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

    private bool BoltLoadExists(int key) 
    { 
     return db.BoltLoads.Count(e => e.Id == key) > 0; 
    } 
} 
+0

您是如何测试的? – 2015-02-10 18:05:39

+0

提琴手。这里是我使用的Uri失败:DELETE http:// localhost:52832/odata/BoltLoads(3) – 2015-02-10 18:07:27

回答

0

我想出了问题所在。网站设置为以经典模式运行。一旦我将其更改为集成正确执行的DELETE函数。