ASP.NET MVC——CodeFirst开发模式
2016-09-26 20:14
369 查看
Entity Framework框架提供了几种开发模式,比如Database First,Model First,Code First。Database First是最老也是应用得最广泛的一种设计方式。Database First这种方式的设计高度依赖于数据库中表的结构,根据表及表间的关系来创建模型。如果后期需求有所变更或者功能有很大变化的话,需要涉及到更改数据库所付出的代价将会很大,因为之前编写好的代码将不再适用于新的表,我们必需重构以更改代码中的逻辑以适应更改之后的表。Model First是创建ADO.NET实体对象以及它们之间的关系,然后再指定到数据库的映射。这个实体对象即为Model。
我们今天要讲的是Code First(代码先行)。它思想就是先定义模型中的类,再通过这些类生成数据库。这种开发模式适合于全新的项目,它使得我们可以以代码为核心进行设计而不是先构造数据库。
接下来我就以一个简单的例子来介绍这种开发模式。我们的需求是两个表,博客表和评论表。一个博客对应多个评论,一个评论对应一个博客。这是一对多关系。我们先新建一个ASP.NET MVC项目,并用NuGet安装EntityFramework。然后建立两个Model。
接下来我们创建数据上下文。新建一个文件夹叫Context,并在其中新建类,代码如下:
接着我们在Web.config中来配置数据库,我们使用轻量级的LocalDB。在Web.config中的<configuration>节点中加入如下配置
接下来,我们新建一个控制器,选择“包含视图的MVC5控制器(使用Entity Framework)”,因为我们的重点是讲CodeFirst,所以我们直接利用模板来生成控制器和视图,模型类选择Blog,数据上下文类选择EFDbContext(这里需要预先编译一下才能看到),控制器名称为HomeController,点击添加,我们便有了具有CRUD功能的Controller和View。
我们运行项目,就可以进行CRUD操作了。然后我们结束调试,打开服务器资源管理器,在数据连接那里就可以看到我们利用代码生成的数据库表。
最后,我们来讲讲表与表之间的关系。有三种,一对一关系,一对多关系,多对多关系。主要在导航属性里进行配置,比如前面的blog表和comment表,我们在类里面加了这样的代码。
多对多关系我们便需要借助第三张表来链接。
我们今天要讲的是Code First(代码先行)。它思想就是先定义模型中的类,再通过这些类生成数据库。这种开发模式适合于全新的项目,它使得我们可以以代码为核心进行设计而不是先构造数据库。
接下来我就以一个简单的例子来介绍这种开发模式。我们的需求是两个表,博客表和评论表。一个博客对应多个评论,一个评论对应一个博客。这是一对多关系。我们先新建一个ASP.NET MVC项目,并用NuGet安装EntityFramework。然后建立两个Model。
public class Blog { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } public string Title { get; set; } public string Author { get; set; } public DateTime Time { get; set; } public string Summary { get; set; } public string Content { get; set; } public virtual ICollection<Comment> Comments { get; set; } = new List<Comment>(); }
public class Comment { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } public string VisitorName { get; set; } public string Email { get; set; } public DateTime Time { get; set; } public string Content { get; set; } [ForeignKey("Blog")] public Guid BlogId { get; set; } public virtual Blog Blog { get; set; } }
接下来我们创建数据上下文。新建一个文件夹叫Context,并在其中新建类,代码如下:
public class EFDbContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Comment> Comments { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); //去除“设置表名为复数”这条约定 } }
接着我们在Web.config中来配置数据库,我们使用轻量级的LocalDB。在Web.config中的<configuration>节点中加入如下配置
<connectionStrings> <add name="EFDbContext" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Blog;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
接下来,我们新建一个控制器,选择“包含视图的MVC5控制器(使用Entity Framework)”,因为我们的重点是讲CodeFirst,所以我们直接利用模板来生成控制器和视图,模型类选择Blog,数据上下文类选择EFDbContext(这里需要预先编译一下才能看到),控制器名称为HomeController,点击添加,我们便有了具有CRUD功能的Controller和View。
我们运行项目,就可以进行CRUD操作了。然后我们结束调试,打开服务器资源管理器,在数据连接那里就可以看到我们利用代码生成的数据库表。
最后,我们来讲讲表与表之间的关系。有三种,一对一关系,一对多关系,多对多关系。主要在导航属性里进行配置,比如前面的blog表和comment表,我们在类里面加了这样的代码。
public virtual ICollection<Comment> Comments { get; set; } = new List<Comment>(); //一个blog对应多个comment
public virtual Blog Blog { get; set; } //一个comment对应一个blog
多对多关系我们便需要借助第三张表来链接。
相关文章推荐
- [翻译-ASP.NET MVC]Contact Manager开发之旅迭代4 - 利用设计模式松散耦合
- [翻译-ASP.NET MVC]Contact Manager开发之旅迭代4 - 利用设计模式松散耦合
- asp.net网站MVC开发模式下实现Sitemap(站点导航)的一些经验教训
- ASP.NET MVC+LINQ开发一个图书销售站点(5):创建逻辑层接口
- 为ASP.NET MVC开发一些常用插件(二)—— 实现无刷新文件上传
- ASP.NET MVC+LINQ开发一个图书销售站点(10):作者管理
- ASP.NET MVC Framework与WCSF中MVP模式之小小比较
- ASP.NET MVC Framework与WCSF中MVP模式之小小比较
- [ASP.NET学习笔记之二十九]在Web Service中的异步开发模式
- ASP.NET MVC - 使用Post, Redirect, Get (PRG)模式
- ASP.NET MVC+LINQ开发一个图书销售站点
- [导入]为ASP.NET MVC开发一些常用插件(三)——Repeater
- ASP.NET MVC+LINQ开发一个图书销售站点
- ASP.NET MVC Framework与WCSF中MVP模式之小小比较
- ASP.NET MVC+LINQ开发一个图书销售站点
- ASP.NET MVC+LINQ开发一个图书销售站点(3):建立数据库
- ASP.NET MVC+LINQ开发一个图书销售站点(1):需求分析
- ASP.NET MVC Framework与WCSF中MVP模式之小小比较
- 基于ASP.NET MVC PV3与ExtJS2.0的开发(CRUD)
- ASP.NET项目开发中的工厂模式