将Web Api添加到使用Entity框架的现有MVC 4应用程序

时间:2013-04-04 03:24:31

标签: entity-framework asp.net-mvc-4 asp.net-web-api

我已经在这几天了。我有一个现有的MVC 4项目,它使用实体框架来创建数据库。该应用程序按预期工作,但我有一个新的要求,即将web api添加到此站点。这是一个引号数据库,要求是返回一个只包含完整数据库条目的有限信息的简单引用。

我原来的模特:

    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; }
         }
     }

上下文(*注意当我构建新的QuoteApiController时,SimpleQuote条目被自动添加)

    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模型,但我只需要将quote,author和category作为字符串返回。我只是在控制器中返回Quote对象,提取我需要的信息,然后返回SimpleQuote对象?不知道该怎么做。有什么建议吗?

2 个答案:

答案 0 :(得分: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;

    }

答案 1 :(得分: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;

    }