这几天生病了,也没有心情写博客,北京医院真心伤不起呀,钱很多花,病没治好,还增长了新病,哎不说了,周末还得去大医院检查一下,趁女盆友尚未回来,把前几天写的东西总结一下。本文也会接触一点webApi的东东,本身最近也一直在看,算是入门了吧。本文用到的知识点有MVC四、knockout.js、EntityFramework、WebApi、Redis缓存及基于Redis缓存的Session共享,都是很基础的操做,MVC我会介绍过滤器及错误捕捉,EntityFramework增删改数据,WebApi作为数据通讯以及Redis的基本缓存操做等。html
若是你对这些知识还不太熟悉,请打开链接阅读前几篇文章。http://www.cnblogs.com/lc-chenlong/web
本文参考:数据库
http://www.cnblogs.com/artech/archive/2012/05/14/web-api-demo.html(蒋金楠)json
http://www.cnblogs.com/rohelm/p/3195750.html(webAPI入门讲解)api
本文主要实现如下功能:缓存
经过一个学生信息的管理来实现该项目。本人对webApi也是入门级别,若是过得不对的欢迎指正,也欢迎分享学习资料。session
一、咱们先介绍一下WebApi项目,项目结构以下图ide
1.一、Students.cs实体类学习
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; namespace MvcWebApi.Models { [Table("tb_Students", Schema = "dbo")]//关联数据表 dbo.tb_Students public class Students { [Key] public string Num { get; set; } [MaxLength(10),Required(ErrorMessage="姓名不能为空")] [Column(TypeName = "nvarchar")] public string Name { get; set; } public int Age { get; set; } [MaxLength(10)] [Column(TypeName = "varchar")] public string Sex { get; set; } [MaxLength(50)] public string Class { get; set; } } }
1.二、DbHelper.cs数据库上下文ui
该文件主要定义数据库的上下文,我对EF用的海曙不够熟练,最近也一直在看,推荐一我的的博客,是一个EF学习的系列,讲的还不错。http://www.cnblogs.com/wlflovenet/archive/2011/12/30/EF11.html
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Entity; using System.Data.Entity.Migrations; namespace MvcWebApi.Models { public class DbHelper : DbContext { public DbHelper() : base("strConn") { //自动建立表,若是Entity有改到就更新到表结构 Database.SetInitializer<DbHelper>(new MigrateDatabaseToLatestVersion<DbHelper, ReportingDbMigrationsConfiguration>()); } public DbSet<Students> Students { get; set; } } internal sealed class ReportingDbMigrationsConfiguration : DbMigrationsConfiguration<DbHelper> { public ReportingDbMigrationsConfiguration() { AutomaticMigrationsEnabled = true;//任何Model Class的修改將會直接更新DB AutomaticMigrationDataLossAllowed = true; } } }
1.三、ValuesController.cs数据操做控制器
在控制器中咱们定义了增删改查的基本方法,及Redis的操做,该控制器中只有Get()方法判断了session是否为空,这里只是为了验证一下session的值是否传递过来了。本知识点参照文章:http://www.cnblogs.com/newton/p/3238082.html
看代码以前下介绍一下Redis的一个操做。一、Redise.AddEntityToList<Students>("stuList", stu);咱们定义了一个缓存键位stuList的缓存列表,该缓存列表存储的是Students实体,而不是把List<Students> stu存进去。二、Redise.AddEntityToList<Students>("stuList", stu);将单个stu对象存进缓存链表中。三、Redise.GetList<Students>("stuList")从缓存中获取列表。
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using MvcWebApi.Models; using Common; using System.Data; namespace MvcWebApi.Controllers { public class ValuesController : ApiController { SessionHelper session = new SessionHelper(); RedisHelper Redise = new RedisHelper(); // GET api/values public HttpResponseMessage Get() { //判断session的值是否传递过来 if (session["user"] == null) { return Request.CreateResponse(HttpStatusCode.OK, new { type="error",data="session为空,清先登录"}); }
//从stuList缓存链表获取数据 var stuList = Redise.GetList<Students>("stuList"); if (stuList == null || stuList.Count()==0) { using (DbHelper db = new DbHelper()) { stuList = db.Students.ToList(); //建立stuList缓存链表 Redise.AddList<Students>("stuList", stuList); } } var data = new { type = "success", data = stuList }; return Request.CreateResponse(HttpStatusCode.OK, data); //db.Students.ToList(); } // GET api/values/5 public Students Get(string id) { Students stu = Redise.GetList<Students>("stuList").Where(it => it.Num == id).FirstOrDefault(); if (stu == null) { using (DbHelper db = new DbHelper()) { stu=db.Students.Where(it => it.Num == id).FirstOrDefault(); if (stu != null) { //向stuList缓存链表中添加实体 Redise.AddEntityToList<Students>("stuList", stu); } } } return stu; } // POST api/values public void Post([FromBody] Students stu) { } // PUT api/values/5 public HttpResponseMessage Put([FromBody] Students stu) { Students RedStu = Redise.GetList<Students>("stuList").Where(it => it.Num == stu.Num).FirstOrDefault(); Redise.RemoveEntityFromList<Students>("stuList", RedStu); Redise.AddEntityToList("stuList", stu); using (DbHelper db = new DbHelper()) { db.Entry(stu).State = EntityState.Modified; db.SaveChanges(); } return Request.CreateResponse(HttpStatusCode.OK, new { type = "success" }); } // DELETE api/values/5 public void Delete(int id) { } } }
介绍一下下面代码返回的json数据格式
var data = new { type = "success", data = stuList }; return Request.CreateResponse(HttpStatusCode.OK, data);
数据格式为:
{"type":"success",data:[{},{},{}]}
今天就写到这里吧。明天继续写MVC调用WebAPi。源代码下一篇写完奉上。
天天学习一点点,天天进步一点点