虽然ASP.NET MVC框架没有直接提供内置的数据库访问支持,但是有很多流行的.NET数据库可以用来轻易实现数据库访问操作。
微软的Entity Framework(EF)就是其中之一。Entity Framework是一个简单、灵活的对象的关系映射(object relation mapping,ORM)框架,它可以使用面向对象的方式帮助开发人员查询、更新存储在数据库中的数据。
此外,Entity Framework实际上也是.NET框架的一部分,微软对它提供了全力支持,而且有很多技术文档供我们学习、使用。
Entity Framework提供了一些定义数据模型和使用模型访问数据库的方法,但是最好的方法应该是代码优先(Code First)方法。这个方法提倡以应用程序模型为中心,并以应用模型驱动整个开发过程。
代码优先:管理优先原则
使用代码优先(Code First)方法开发项目时,数据库交互通过简单的模型类进行(朴素的旧的对象Plain Old CLR Object,简称POCO)。Entity Framework代码优先方法非常强大,甚至可以在运行程序时根据我们定义的模型来生成数据库Schema,并使用这个Schema来创建数据库和实体(表,关系等)。
代码优先方法通过遵循特定的惯例来自动评估模型层中各种属性和模型类的信息、他们之间的关系以及如何使用数据库表示这些模型关系。
例如,电子交易网站EBuy里,Auction模型类映射到数据库中的Auctions表上,而且表中的每个例与模型类的属性一一对应。这个表和列名就是自动从模型类中获取的。
使用Entity Framework代码优先模式创建数据访问层
Entity Framework代码优先模式的核心依赖于System.Data.Entity.DbContext类。这个类(或者它的子类)是代码访问数据库的网关,它提供了数据库相关的操作。
在使用DbContext类之前,需要先继承它。事实上,编写子类代码非常容易:
using System.Data.Entity;
public class EbuyDataContext: DbContext
{
public DbSet<Auction>Auctions {get; set;}
}
在例子Ebuy的DataContext.cs里,我们创建了一个自定义的数据上下文类,名字叫EbuyDataContext,它继承自DbContext。这个类定义了一个属性System.Data.Entity. DbSet<T>,T是编辑或保存到数据库的实体对象的类型。上面的例子定义了System.Data.Entity..DbSet<Auction>,表示需要保存和编辑Auction对象数据到数据库。可以在数据上下文李定义多个实体,随着学习的深入,会逐步增加更多的实体(或DbSet属性)到EbuyDataContext类里。
如果说创建自定义数据上下文很简单,那么使用起来就更加容易了。下面的代码调用了Create操作来保存Auction对象到数据库里:只需要把Auction对象放到EbuyDataContext。Auctions集合里,然后保存修改即可。
[HttpPost]
public ActionResult Create(Auction auction)
{
var db = new EbuyDataContext();
db.Auctions.Add(auction);
db.SaveChanges();
return View{auction};
}
当运行网站并提交填写过的表单页面时,数据库里就会自动添加一条新的信息。如果再修改几次例子,尝试一些不同的数据,就会发现ASP.NET MVC模型绑定十分宽松,用户可以随便输入,只要不把表单提交的数据转换为强类型(例如,当用户输入“ABC”时就预防转换为int类型)。如果需要对保持到数据库的数据进行严格的限制,就需要使用数据验证机制。