2013-04-04 51 views
3

我一直在爲此進行了幾天的研究。我有一個現有的MVC 4項目,它使用實體框架來創建數據庫。該應用程序按預期工作,但我有一個新的要求,以添加web api到這個網站。這是一個引用數據庫,並且要求返回僅包含完整數據庫條目的有限信息的簡單引用。將WebApi添加到使用實體框架的現有MVC4應用程序

我的原始模型:

using System; 
    using System.Collections.Generic; 
    using System.ComponentModel.DataAnnotations; 
    using System.Linq; 
    using System.Web; 

    namespace Exercise4.Models 
    { 
     public class Quote 
     { 
      public int QuoteID { get; set; } 

      [Required (ErrorMessage = "A Category Field Must be selected or a New one must be Created before continuing")] 
      public int CategoryID { get; set; } 

      [Display (Name="Quotation")] 
      [Required (ErrorMessage = "A Quotation is Required")] 
      public string QName { get; set; } 

      [Display (Name= "Author")] 
      [Required (ErrorMessage = "An Authors Name is Required\n Use 'Unknown' if needed")] 
      public string QAuthor { get; set; } 


      [Display (Name = "Category")] 
      public virtual Category category { get; set; } 

      [DisplayFormat(DataFormatString = "{0:d}")] 
      public DateTime Date { get; set; } 

      public int UserId { get; set; }  
      } 
     } 

的簡單報價型號

using System; 
    using System.Collections.Generic; 
    using System.ComponentModel.DataAnnotations; 
    using System.Linq; 
    using System.Web; 

    namespace Exercise4.Models 
    { 
     public class SimpleQuote 
     { 
      public int Id { get; set; } 
      public string Quote { get; set; } 
      public string Author { get; set; } 
      public string Category { get; set; } 
     } 
    } 

上下文(*注被automagicly添加SimpleQuote條目時我腳手架新QuoteApiController)

using System; 
    using System.Collections.Generic; 
    using System.Data.Entity; 
    using System.Linq; 
    using System.Web; 

    namespace Exercise4.Models 
    { 
     public class QuoteContext : DbContext 
     { 
      public DbSet<Quote> Quotes { get; set; } 
      public DbSet<Category> Categories { get; set; } 
      public DbSet<UserProfile> UserIds { get; set; } 

      public QuoteContext() 
      { 
       Configuration.ProxyCreationEnabled = false; 
      } 

      public DbSet<SimpleQuote> SimpleQuotes { get; set; } 

     } 
    } 

訪問/ api/quoteapi /頁面時返回錯誤

'ObjectContent`1'類型無法序列化內容類型'application/xml;字符集= UTF-8' 。

很明顯,這個錯誤是因爲它試圖返回一個數據庫中不存在的SimpleQuote對象。

創建的API控制器。

using System; 
    using System.Collections.Generic; 
    using System.Data; 
    using System.Data.Entity; 
    using System.Data.Entity.Infrastructure; 
    using System.Linq; 
    using System.Net; 
    using System.Net.Http; 
    using System.Web; 
    using System.Web.Http; 
    using Exercise4.Models; 

    namespace Exercise4.Controllers 
    { 
     public class QuoteApiController : ApiController 
     { 
      private QuoteContext db = new QuoteContext(); 

      // GET api/QuoteApi 
      public IEnumerable<SimpleQuote> GetSimpleQuotes() 
      { 
       return db.SimpleQuotes.AsEnumerable(); 
      } 

      // GET api/QuoteApi/5 
      public SimpleQuote GetSimpleQuote(int id) 
      { 
       SimpleQuote simplequote = db.SimpleQuotes.Find(id); 
       if (simplequote == null) 
       { 
        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound)); 
       } 

       return simplequote; 
      } 

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

我要去哪兒。我無法返回數據庫中不存在的模型。如果我在api中更改了調用以返回可用的報價模型,但我只需要將報價,作者和類別作爲字符串返回。我只要返回控制器中的Quote對象,拿出我需要的信息,然後返回SimpleQuote對象?不知道該怎麼做。有什麼建議麼?

回答

0

I 1+和接受@ CHammond的迴應讓我走上正軌。我確實需要返回一個SimpleQuote對象。這是我使用的代碼。

  public SimpleQuote GetSimpleQuote(int id) 
    { 
     var quote = db.Quotes.Find(id); 
     if (quote == null) 
     { 
      throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound)); 
     } 

     SimpleQuote output = new SimpleQuote(); 
     output.Quote = quote.QName; 
     output.Author = quote.QAuthor; 
     output.Category = db.Categories.Find(quote.CategoryID).CatName; 

     return output; 

    } 
1

您提到了腳手架,您是否使用Code First創建數據庫? 此外,您只希望SimpleQuote能夠返回信息,它看起來像將其作爲表格添加到數據庫上下文中。當你真正想要的是從報價表中提取數據並構建或提取你想要的信息並返回。如果你不必返回一個SimpleQuote對象並且返回一個字符串,你可以寫一些非常簡單的東西。

public HttpResponseMessage GetSimpleQuote(int id) 
    { 
     var quote = db.Quotes.Find(id); 
     if (quote == null) 
     { 
      throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound)); 
     } 

     var output += "ID: " + quote.Id + " Quote: " + quote.Quote + " Author: " + quote.Author + " Category: " + quote.Category ; 

     var response = new HttpResponseMessage(); 

     response.Content = new StringContent(output); 
     response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain"); 

     return response; 

    } 
+0

@jbolt:不要對顯着改變原始上下文的答案進行編輯。 – 2013-04-04 12:26:14

相關問題