vs2015中使用默认的localdb创建数据库并实现增删查改(结合WebAPI)

本文主要参考官方文档Using Web API 2 with Entity Framework 6Enabling CRUD Operations in ASP.NET Web API 1。webapi2和webapi1在使用localdb上差别不大,操作过程是一样的。

LocalDB简介

本文用到的主要软件:visual studio 2015、webapi2、localdb(version 2014)以及entity framework


第一步——添加localdb连接

新建一个webapi项目(步骤参考),若是勾选“individual authentication”,则项目会自动生成account authentication API,默认使用membership database,该项目可不用验证,也不用在azure上发布。然后在Web.config的<connectionStrings></connectionStrings> 中添加localdb连接代码,如下:

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-TestWebAPI-20180410113854.mdf;Initial Catalog=aspnet-TestWebAPI-20180410113854;Integrated Security=True"
         providerName="System.Data.SqlClient" />
    <add name="ProductDBContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Products-20180410113854.mdf;Initial Catalog=Products-20180410113854;MultipleActiveResultSets=True;Integrated Security=True"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

第一个connectionString是勾选individual authentication默认生成的,可不用;第二个是我们手动添加的,name不要随意取,须符合DBContext,不然找不到数据库(随意取也行,官方文档就使用了另外一种连接方式,但本质都是一样的),Data Source因为vs2015默认localdb是2014版本的,所以选择MSSQLLocalDB,2012版本则选择v11.0.0;AttachDbFilename默认会在项目APP_Data文件夹中生成对应的mdf文件(数据库文件),其他参数可自行更改,Initial Catalog名称任取。到此localdb连接即添加完成。

第二步——添加models和controllers

在Models和Controllers文件夹中添加你需要的model和controller,modal建立实体类,controller用来写CRUD API(增删查改);然后在实体类后面添加数据库映射,建立DBContext:


第三步——生成数据库和表

步骤见Use Code First Migrations to Seed the Database

第四步——在controller中写增删查改API

代码如下:

    //[Authorize(Roles = "Administrator")]
    public class AdminController : ApiController
    {
        private OrdersContext db = new OrdersContext();//此处改成自己建立的localdb连接name

        // GET api/Admin
        public IEnumerable<Product> GetProducts()
        {
            return db.Products.AsEnumerable();
        }

        // GET api/Admin/5
        public Product GetProduct(int id)
        {
            Product product = db.Products.Find(id);
            if (product == null)
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
            }

            return product;
        }

        // PUT api/Admin/5
        public HttpResponseMessage PutProduct(int id, Product product)
        {
            if (ModelState.IsValid && id == product.Id)
            {
                db.Entry(product).State = EntityState.Modified;

                try
                {
                    db.SaveChanges();
                }
                catch (DbUpdateConcurrencyException)
                {
                    return Request.CreateResponse(HttpStatusCode.NotFound);
                }

                return Request.CreateResponse(HttpStatusCode.OK);
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest);
            }
        }

        // POST api/Admin
        public HttpResponseMessage PostProduct(Product product)
        {
            if (ModelState.IsValid)
            {
                db.Products.Add(product);
                db.SaveChanges();

                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, product);
                response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = product.Id }));
                return response;
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest);
            }
        }

        // DELETE api/Admin/5
        public HttpResponseMessage DeleteProduct(int id)
        {
            Product product = db.Products.Find(id);
            if (product == null)
            {
                return Request.CreateResponse(HttpStatusCode.NotFound);
            }

            db.Products.Remove(product);

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                return Request.CreateResponse(HttpStatusCode.NotFound);
            }

            return Request.CreateResponse(HttpStatusCode.OK, product);
        }

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

如果上述代码中PUT即更新操作出现400 bad request错误,可试着将PUT的代码更换成:

        //PUT: /api/products/id
        public Boolean Put(int id, [FromBody]Product product)
        {
            var item = db.Tasks.SingleOrDefault(s => s.Id == id);

            if (item == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
                //return false;
            }
            else
            {
                item.Name = product.Name;
                item.NodeId = product.NodeId;
                item.NodeInfo = product.NodeInfo;
                item.Category = product.Category;
                item.TaskType = product.TaskType;
                item.Price = product.Price;
                item.Id = id;

                db.Entry(item).State = System.Data.Entity.EntityState.Modified;
                db.SaveChanges();
                return true;
            }
        }
博主在写webapi和数据库的时候有时会出现莫名其妙的错误,比如上面这个,官方给出的PUT API的代码明明是对的,但是实际测试时老是报400 bad request error,后来换成我这个代码就好了,读者如果遇到和我一样的情况可以试试。到此就可以使用ajax来测试web api进行增删查改了,本文仅供参考。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页