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

原创 2018年04月16日 14:29:59

本文主要参考官方文档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进行增删查改了,本文仅供参考。

在visual studio2015中如何使用localDB具体讲解

经过一段时间探究终于基本掌握在vs2015中如何使用localDB了,当然包括其中令人头疼的   connectionStrings的设置,这也算承接我之前写的一篇文章初识visual st...
  • u012865694
  • u012865694
  • 2015-12-11 14:47:26
  • 3025

VS2015自带的LocalDB数据库的用法

对于程序员来说,编程过程中或多或少会和数据库打交道。如果采用Visual Studio进行程序开发,则微软的Sql Server数据库是最好的选择。但是问题来了,Sql Server数据库动辄几个G,...
  • qq_36747842
  • qq_36747842
  • 2017-06-06 11:19:09
  • 2201

VS2013 使用localDB快速搭建数据库开发环境

一,localDB是啥听名取义,localDB即本地数据库,大伙都知道VS和SQL Server都是微软自家的东西,既然有了SQL Server了,还搞啥localDB。作为一个程序猿来说,开发的电脑...
  • woshisangsang
  • woshisangsang
  • 2017-10-29 19:52:13
  • 603

如何修改Visual Studio默认数据库localDB

http://jingyan.baidu.com/article/c85b7a640928cb003bac958b.html 明日更新!
  • u011982340
  • u011982340
  • 2014-09-23 00:11:04
  • 526

EF Code First中数据库位置设置

当我们在创建EF Code First项目时,默认生成数据库存放地方是在项目下的App_Date下,命名则是根据你的Context生成。但是由于一些常用习惯,我们需要让数据库创建在sql中。 那么我...
  • qq289523052
  • qq289523052
  • 2013-03-13 15:50:06
  • 5000

学习ASP .NET MVC5官方教程总结(五)使用SQL Server LocalDB创建连接字符串

学习ASP .NET MVC5官方教程总结(五)使用SQL Server LocalDB创建连接字符串         在上一章中,我们创建了MovieDBContext类来连接数据库、处理Movi...
  • yejinwei1220
  • yejinwei1220
  • 2015-04-29 14:04:26
  • 1942

vs2013 中localdb 的使用(1)

1.安装好vs2013 后 会出现 C:\Program Files\Microsoft SQL Server\110\Tools\Binn 这样一个目录打开cmd 运行 cd C:\P...
  • xiawu1990
  • xiawu1990
  • 2016-08-05 16:57:50
  • 747

ASP.NET MVC5 之问题集(一):连接SQLSERVER2012的LocalDB

问题背景:在ASP.NET MVC5编程实战3代码实例-CH02中用SQL Server 2012MSSSMS(微软SQLSERVER管理工具)附加.mdf(Primary Data File)文件后...
  • ys214992
  • ys214992
  • 2016-03-06 21:56:30
  • 731

vs2015 webapi模板中 身份验证的调用

参考博客http://www.cnblogs.com/yuefei/p/4250027.html webapi自带了一套身份验证,使用方法为: 1、webapi地址/api/Account/Regis...
  • tongdengquan
  • tongdengquan
  • 2017-03-10 18:33:12
  • 1615

Android中数据库的创建与增删改查操作

今天写一下关于Android中数据库Sqlite的一些基本操作吧。 首先创建一个类继承SqliteOpenHelper并重写其方法,另外需要另外加一个构造函数,如下: public MyOpenHel...
  • kuangxiaoguo0123
  • kuangxiaoguo0123
  • 2015-09-30 21:18:40
  • 1533
收藏助手
不良信息举报
您举报文章:vs2015中使用默认的localdb创建数据库并实现增删查改(结合WebAPI)
举报原因:
原因补充:

(最多只允许输入30个字)