前言
上一章记录了如何以MVC的方式建立一个网页,但是对于网站开发,网页是不够的,还必须用到数据库,只有建立了数据库,网站才算完整。
本章记录几个数据库建立的方式。
何谓ORM
ORM的全名是Object Relational Mapping,是一种编程技术,用于实现面向对象程序语言里,不同系统之间的数据转换,实际应用中,大多数应用在数据库与面向对象程序之间的转换。
如上图,当我们的.NET程序视图要读取数据时,只要对ORM框架中的对象读取数据,剩下的工作便可由ORM框架帮我们完成,当ORM访问完数据库以后,再将得到的数据回传给.NET程序。
如此一来,.NET应用程序便可以专注于处理对象,实现MVC关注点分离的原则。
Entity Framework是微软提供的ORM工具,除非特别说明,本系列文章所用的一切ORM手段皆是基于Entity Framework。
Code First Development
Code First Development:程序代码优先开发模式,是一种非常新颖的开发模式,也就是让开发人员可以根据需求,在程序里面建立数据结构,然后通过ORM的管理,转换成实体模型(Entity Model)。直到程序运行后,通过ORM框架,就可以自动创建数据库。
这样开发人员就可以完全不需要接触数据库的操作管理,也不用学习各式数据库的使用,省去大量工作内容,增加对开发的关注度。
本系列文章中,如非特别说明,都是基于Code First模式开发。
第一个数据库
现在我们基于Code First原则,尝试建立第一个数据库。
实体类
实体类用于定义数据结构
~/Model/Movie.cs
using System;
using System.ComponentModel.DataAnnotations;
namespace MvcDemo.Models {
//数据结构
public class Movie {
[Key]
public int ID { get; set; }
public string Title { get; set; }
public string Director { get; set; }
public string Content { get; set; }
public DateTime Date { get; set; }
}
}
上下文类
我们需要一个上下文类,用于管理数据库的链接,注意上下文类可以管理多个数据库。
~/Model/MvcDemoContext.cs
using System.Data.Entity;
namespace MvcDemo.Models {
public class MvcDemoContext : DbContext
{
//数据库连接,注意后缀多个s
public DbSet<Movie> Movies { get; set; }
}
}
引用上下文类
想要使用数据库,就必须引用数据库的上下文类,例如:
using System.Web.Mvc;
namespace MvcDemo.Controllers
{
public class HomeController : Controller {
//引用数据库上下文类
private MvcDemoContext db = new MvcDemoContext();
public ActionResult Index() {
return View();
}
public ActionResult About() {
return View(db);
}
}
}
这样一来,About页面就能够使用数据库的数据了。
启用自动数据库迁移
通常在开发的时候,我们很难一次性定义一个完美的数据模型,在后期开发中,也有可能不断去完善它,可以如果我们更改数据模型,数据库就会报错,这个时候就需要开启数据库迁移功能。
双击~/Global.asax
文件,修改如下
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using System.Data.Entity;
using MvcDemo.Models;
namespace MvcDemo {
public class MvcApplication : System.Web.HttpApplication {
protected void Application_Start() {
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//使用数据库初始化器自动迁移
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MvcDemoContext, DbMigration>());
}
}
//新建数据库迁移类
public class DbMigration : System.Data.Entity.Migrations.DbMigrationsConfiguration<MvcDemoContext> {
public DbMigration() {
this.AutomaticMigrationsEnabled = true;
this.AutomaticMigrationDataLossAllowed = true;
}
}
}
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MvcDemoContext, DbMigration>());
这段代码用人话翻译过来就是:
- 设置数据库的初始化方式
- 方式就是迁移数据库到最新的版本
- 迁移的对象就是前面建立的数据库上下文类,所以尽量用他管理所有的数据库。
- 迁移的参数需要自定义
public class DbMigration : System.Data.Entity.Migrations.DbMigrationsConfiguration<MvcDemoContext> {
public DbMigration() {
//可以自动迁移
this.AutomaticMigrationsEnabled = true;
//允许数据模型的成员变量减少,依然迁移数据库。
this.AutomaticMigrationDataLossAllowed = true;
}
}
开启之后,即使你更改数据模型,也不会报错,或者要求重新建立数据库。
总结
MVC开发大致可以分为如下几个方面,这几个方面可以同时进行,也可以先后开发,没有固定的要求。
如果是Code First,这先在Model里面定义数据模型,系统自动生成数据库,对于一些大型的项目,或者数据库已经建立好的项目,则使用DataBase First模式,这个时候Model的数据模型就要根据DataBase的内容制定。