写在前面的话
觉得之前的入门程序太简单,那么就来点真实点的Demo。好吧,这个Demo也是微软最开始推MVC的电影Demo,玩得不要了,而且我也将其阉割。可是,网上的博客大部分用的还是VS2013(2),而且千篇一律,我已无力吐槽。需要说明的是,我这个也基本是同一个Demo,而且大部分代码是从一年前老师的ppt上copy的,但是我想把遇到的坑记下并分享出来,这是初衷,因为编程的环境不断在更新。
开始
LocalDB本身是VS安装好后自带的一个免费微型数据库,和MS SQL Server用法类似,区别就是它不带Server,有点像Redis。所以LocalDB很适合自己本机测试玩,当然生产环境不太可能用这个。如果想用MSSqlServer,这里是2012express版下载地址,下载这两个:ENU\x64\SQLEXPR_x64_ENU.exe;ENU\x64\SQLManagementStudio_x64_ENU.exe 图形化管理工具,都可以折腾。
然后简单介绍一下Entity Framework(EF),就是一种ORM框架,方便从对象与表之间相互映射,免得从底层一个一个字段获取再封装成类。
第一步是安装EF。从版本5开始使用NuGet安装,vs2017右键项目名(不是解决方案名)选择管理NuGet程序包->选择浏览即可找到EntityFramework安装。
切到浏览页,很容易看到EF:
点击下载后接受协议安装即可。安装好后可以看到项目的引用中有了EF相关的东西:
同时Web.config(全局那个,不是Views目录下的)多了以下代码:
第二步,创建模型类和对应的数据库上下文类,右击Models文件夹添加类,取名为Movie.cs(如果你的EF安装没问题的话Entity那个包导入也就没问题):
using System;
using System.Data.Entity;
namespace AspMVCFirst.Models
{
public class Movie
{
public int ID { get; set; } //电影编号
public string Title { get; set; } //电影名称
public DateTime ReleaseDate { get; set; } //上映时间
public string Genre { get; set; } //电影类型
public decimal Price { get; set; } //电影票价
public string Rating { get; set; } //电影分级
}
public class MovieDBContext : DbContext
{
public DbSet<Movie> Movies { get; set; }
}
}
第三步,给Web.config文件(全局那个,不是Views目录下的)添加连接字符串。有的VS里可能有一个默认的ConnectionString,里面有个名为DefaultConnection的Data Source,这种情况就在这个基础上再加上一个格式类似的连接串。可是我的没有,我只能手动添加(在<configuration>里面且在 <appSettings>上面,这里的name取名为上面的电影数据库上下文类的类名):
<connectionStrings>
<add name="MovieDBContext" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Movies.mdf;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
第四步,添加控制器和视图。添加一个控制器MoveisController和两个Action(一个Index,一个Create,这里都是手工添加视图):
新建一个空控制器MoviesController修改编码如下:
using System.Web.Mvc;
namespace AspMVCFirst.Controllers
{
public class MoviesController : Controller
{
// GET: Movies
public ActionResult Index()
{
return View();
}
public ActionResult Create()
{
return View();
}
}
}
右击Views目录的Movies子目录,添加一个Create视图,点击添加(第一次可能需要花一些时间下载js和css样式文件):
Create.cshtml编码如下:
@{
/**/
ViewBag.Title = "Create";
}
<h2>Create</h2>
<form action="/Movies/Create" method="post">
<div>
<label>电影名称</label> <input type="text" name="Title" />
</div>
<div>
<label>上映日期</label> <input type="text" name="ReleaseDate" />
</div>
<div>
<label>电影类型</label> <input type="text" name="Genre" />
</div>
<div>
<label>电影票价</label> <input type="text" name="Price" />
</div>
<div>
<label>电影分级</label> <input type="text" name="Rating" />
</div>
<div>
<input type="submit" value="创建" />
</div>
</form>
<div>
<a href="/Movies">返回</a>
</div>
修改MoviesController的代码,添加Create的后台部分:
using AspMVCFirst.Models;
using System.Web.Mvc;
namespace AspMVCFirst.Controllers
{
public class MoviesController : Controller
{
private MovieDBContext db = new MovieDBContext();
public ActionResult Index()
{
return View();
}
// 这个Create用来创建页面
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(Movie movie)
{
db.Movies.Add(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
}
}
继续修改控制器向Index视图传递数据:
using AspMVCFirst.Models;
using System.Web.Mvc;
using System.Linq;
using System;
namespace AspMVCFirst.Controllers
{
public class MoviesController : Controller
{
private MovieDBContext db = new MovieDBContext();
public ActionResult Index()
{
var movies = from m in db.Movies
where m.ReleaseDate > new DateTime(2010, 6, 1)
select m;
return View(movies.ToList());
}
// 这个Create用来创建页面
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(Movie movie)
{
db.Movies.Add(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
}
}
添加Index视图,,同样在Movies目录下创建:
Index.cshtml编码如下:
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@model IEnumerable<AspMVCFirst.Models.Movie>
<table width="100%">
<tr>
<th> 电影名称 </th>
<th> 上映日期 </th>
<th> 电影类型 </th>
<th> 电影票价 </th>
<th> 电影分级 </th>
<th> 操作 </th>
</tr>
@foreach (var item in Model)
{
<tr>
<td> <label>@item.Title</label> </td>
<td> <label>@item.ReleaseDate</label> </td>
<td> <label>@item.Genre</label> </td>
<td> <label>@item.Price</label> </td>
<td> <label>@item.Rating</label> </td>
</tr> }
</table>
这样,手动添加视图的方式就基本完成了,我们Ctrl+F5运行一下项目:
修改url试试添加:
点击创建按钮后跳转至Index页面显示如下:
这样,一个基本的Demo就搞好了。还可以看看新生成的数据库在哪个地方:
1..点击解决方案资源管理器中的查看所有文件:
可以看到App_Data目录下多了一个Movies.mdf文件(Web.config中定义的connectionString):
然后点击服务器资源管理器(没有的话在菜单栏的视图中找),右击数据连接刷新,就可以看到通过EF的codefirst自动生成的数据库:
可以看看Movies表中的数据是否是Create视图创建的数据!
最后源码参考!