在本文中,将探讨如何利用Code First技术,结合ASP.NET MVC4框架,快速搭建一个待办事项(TODO)应用程序。将使用MVC Scaffolding技术来快速生成控制器和视图。
在开始之前,请确保已经安装了以下软件:
Code First是一种开发方法论,它允许使用C#或VB.NET类来描述模型。Code First 是从Entity Framework4.1开始提供的新功能,可以使用它来从模型生成新的数据库,或者将模型映射到现有的数据库。
Entity Framework(EF)是一个对象关系映射器,它允许.NET开发者使用特定领域的对象来操作关系数据,从而消除了开发者通常需要编写的大部分数据访问代码。
ASP.NET MVC4 是一个框架,用于构建可扩展的、基于标准的Web应用程序,它使用ASP.NET和.NET框架的强大功能以及已建立的设计模式。
MVC Scaffolding 是一个为ASP.NET提供的脚手架包,可以通过NuGet使用‘Install-Package MvcScaffolding’命令来安装。
在开始之前,请确保已经安装了NuGet包管理器和SQL组件。在Visual Studio 2010中,转到“工具”->“扩展管理器”,搜索并安装NuGet包管理器。
安装NuGet包后,应该能够看到库包管理器。转到“工具”->“库包管理器”->“包管理器控制台”,输入以下命令来安装SQL组件:
Install-Package EntityFramework.SqlServerCompact
创建一个新的MVC4应用程序,将其命名为TODO。
选择Internet应用程序模板,并选择Razor作为视图引擎。
打开包管理器控制台(“工具”->“库包管理器”->“包管理器控制台”),运行以下命令:
Install-Package EntityFramework
Install-Package MvcScaffolding
这将安装MvcScaffolding。
在模型文件夹中创建一个名为Models.cs的文件(实际上,应该为不同的模型创建不同的文件,为了节省时间将它们全部放在一起)。Models.cs包含以下三个模型:
namespace TODO.Models
{
public class Task
{
public int TaskId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int? StatusId { get; set; }
public virtual Status Status { get; set; }
public virtual ICollection<Note> Notes { get; set; }
public DateTime? CreatedOn { get; set; }
public DateTime? ModifiedOn { get; set; }
}
public class Status
{
public int StatusId { get; set; }
public string Name { get; set; }
}
public class Note
{
public int NoteId { get; set; }
public string Description { get; set; }
public int? TaskId { get; set; }
public DateTime? CreatedOn { get; set; }
public DateTime? ModifiedOn { get; set; }
}
}
数据注释和定义关系:
注意第18行,该属性应该是virtual的,并且有一个名为ForeignKey的属性,用于外键链接。同样,查看第16行,需要有StatusId来链接表。
转到包管理器控制台,运行以下命令:
Scaffold Controller Task -Repository
Scaffold Controller Note -Repository
Scaffold Controller Status –Repository
使用‘-Repository’选项,因为希望通过仓库访问数据。当更改模型并想要重新创建控制器或视图时,请使用‘-Force’选项。
打开Shared/_Layout.cshtml并添加链接,以便可以轻松导航到操作,并且可能想要更新应用程序的标题。
运行应用程序,它应该可以正常工作。在开始输入数据并检查数据库之前,让从视图中隐藏CreatedOn和ModifiedOn字段,并从代码本身更新它们。
注释掉Notes和Tasks视图的_CreateOrEdit.cshtml中的div,这些div显示了ModifiedOn和CreatedOn字段。
转到NoteRepository.cs和TaskRepository.cs,找到InsertOrUpdate()方法并进行如下修改:
public void InsertOrUpdate(Task task)
{
if (task.TaskId == default(int))
{
// 新实体
task.CreatedOn = task.ModifiedOn = DateTime.Now;
context.Tasks.Add(task);
}
else
{
// 现有实体
task.ModifiedOn = DateTime.Now;
context.Entry(task).State = EntityState.Modified;
}
}
注意第5行和第9行,在保存和更新模型之前修改了ModifiedOn和CreatedOn。
在tasks的_CreateOrEdit.cshtml中添加以下行,以保留CreatedOn的值:
@Html.HiddenFor(m=>m.CreatedOn)
再次运行应用程序,应该能够添加、更新和删除数据。
这还不是全部,这已经为自动创建了数据库,可以查看它。浏览到SQLExpress数据库,应该能够看到为此应用程序创建的数据库。
检查表、列、主键和外键,它们都完全按照在模型中创建的那样到位。
有很多要解释的内容,但是,根据本文的范围,将本文视为深入了解的起点。在结束本文之前,还想告诉最后一件事,那就是所谓的数据库初始化器。
转到TODOContext.cs,在模型文件夹中,创建TODOContext的构造函数如下:
public TODOContext()
{
System.Data.Entity.Database.SetInitializer(
new System.Data.Entity.DropCreateDatabaseIfModelChanges<TODO.Models.TODOContext>());
}
它的作用正如其名称所说的那样,当通过添加或删除一些属性更改任何模型时,当前数据库将被删除,然后重新创建。如果在没有此构造函数的情况下修改模型,可能会看到以下错误:
已经提到数据库将在SQLExpress中创建,如果在web.config的connectionstring中指定的数据库中没有看到数据库被创建,请不要感到惊讶。