MvcMovieStore mvc5.0,EF6.01

时间:2022-12-10 17:13:44

MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 4、创建数据上下文和数据实体模型

说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC影视(MvcMovie.cn) 进行查阅。如需转载,请注明出处:http://www.cnblogs.com/DoduNet/

上一章我们讨论了如何创建项目和添加/更新程序包,这一章我们讨论一下如何创建数据上下文和数据实体模型;当然,MVC的运行模式大家应该都很清楚,MVC 表示 模型-视图-控制器。MVC 是一种用于应用程序开发的框架,基于 MVC 应用程序中包含:

  • Models: 表示应用程序的数据和使用验证逻辑来强制执行业务规则的数据的类。
  • Views: 您的应用程序用来动态生成 HTML 响应的模板文件。
  • Controllers: 处理传入的浏览器请求的类中检索模型数据,然后指定将响应返回到浏览器中的视图模板。

至于如何添加 控制器、模型、视图这些概念在【译】ASP.NET MVC 5 官方教程这个系列教程中都有详细提到,所以我们并不作为主要讲解内容,在以后的过程中也都会涉及到。

现在我们再来看一下Code First,Code First最原始的原型实际上被叫做只有代码(Code Only)。这是因为开发者只需要写代码,将会自动创建模型和数据库。是因为有一个特别的类(继承与System.Data.Entity.DbContext),这个类就是我们即将要谈到的数据上下文,而数据上下文又与我们在Web.config中设置的数据连接字符串相对应,数据连接配置 和 数据上下文的关系,这里不作过多阐述。

创建数据上下文:

打开我们上节中已经创建好的项目,可以在解决方案资源管理器中看到如下图所示的IdentityModels.vb这个文件,如下图所示:

MvcMovieStore mvc5.0,EF6.01

从文件名我们大概可以理解为:身份模型,顾名思义就是说这个文件中应该是与我们这个项目所使用的身份认证有关的类或者设置。打开之后我们可以看到两个类:

MvcMovieStore mvc5.0,EF6.01
 1 Imports Microsoft.AspNet.Identity.EntityFramework
2
3 ' You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
4 Public Class ApplicationUser
5 Inherits IdentityUser
6 End Class
7
8 Public Class ApplicationDbContext
9 Inherits IdentityDbContext(Of ApplicationUser)
10 Public Sub New()
11 MyBase.New("DefaultConnection")
12 End Sub
13 End Class
MvcMovieStore mvc5.0,EF6.01

ApplicationUser:应用程序用户,ApplicationDbContext:应用程序数据上下文;

不错,项目默认已经为我们创建好了数据上下文,你可能会问现在这个类怎么不是继承的System.Data.Entity.Dbcontext呀?,那么,我们在IdentityDbContext处点击右键,选择转到定义,如下图所示:

MvcMovieStore mvc5.0,EF6.01

之后会在工作区打开“对象浏览器”窗口,从这里可以很清楚的看出,IdentityDbContext的继承关系,没看错,他就是继承的System.Data.Entity.Dbcontext;如下图所示:

MvcMovieStore mvc5.0,EF6.01

也就是说,我们的项目中已经有了一个数据上下文存在,那么我还需要再创建一个吗?,对于我们现有的项目,不需要多个数据库,一个就够我们用的了,所以答案是,不需要!需要的是我们对此进行扩充。我们现在来运行一下项目,看看这个数据上下文是不是真的有效。按F5运行项目,等待打开浏览器……,如下图所示:

MvcMovieStore mvc5.0,EF6.01

我们在项目的web.config中默认提供了数据连接字符串,根据字符串我们知道数据库的位置应该是在项目根目录的app_Data文件夹,点击导航栏中的“注册”,并完成表单注册一个用户(想验证刚才提到的数据上下文是否有效,需要页面操作涉及到数据模型的操作时,mvc才会通过数据上下文自动创建数据库),如下图所示:

MvcMovieStore mvc5.0,EF6.01

如注册成功后,会自动登陆,并转到首页,当看到导航栏右侧有欢迎词语时,说明我们已经注册成功!如下图所示:

MvcMovieStore mvc5.0,EF6.01

那么打开App_Data文件夹,你就会发现多出来了两个文件:

  • aspnet-MvcMovieStore.Web-20131104112149.mdf
  • aspnet-MvcMovieStore.Web-20131104112149_log.ldf

bingo,你猜对了,这个数据上下文是正常工作的,只不过ApplicationDbContext 继承与IdentityDbContext(Of ApplicationUser)这个类就是添加了身份认证功能,关于Aspnet.Identity 身份认证功能我们在后面的章节中会详细阐述。而现在我们完全可以使用这个数据上下文来完成我们之后的操作,仅仅需要的是我们对该数据上下文进行扩充,至于扩充的属性,我们等创建数据实体模型后再讲。

创建数据实体模型:

在 原创:MVC 5 实例教程(MvcMovieSore 新概念版:mvc5.0,EF6.01) - 2、数据框架 和 功能预览 中我有贴出“数据结构拓扑图”,这些数据表(也就是上面提到的MVC中的“Models”)是如何创建,以及各个表中间的关系是我们这章的主要内容。

下面我们再来看一下数据结构拓扑图:

MvcMovieStore mvc5.0,EF6.01

图中的每一个数据表都是一个数据实体,都是一个类,而每一个类都以特别的身份出现在上面我们讲到的数据上下文中。下面我们仅仅以“Movie”及与其相关联的几个实体为例来说明创建数据实体模型:

在解决方案资源管理器中找到 Models文件夹,点击右键依次选择:添加/类,如下图所示:

MvcMovieStore mvc5.0,EF6.01

在新建类对话框的类名处输入:MvcMovieStoreModels.vb,之后会看到刚刚建好的类,如下图所示:

MvcMovieStore mvc5.0,EF6.01

删除现有的代码,然后粘贴以下代码:

MvcMovieStore mvc5.0,EF6.01
 1 Public Class Movie
2
3 Property MovieID As Guid
4 Property ChannelID As Guid
5 Property Categories As String
6 Property Poster As String
7 Property Still As String
8 Property Title As String
9 Property TranslationTitle As String
10 Property ReleaseYear As String
11 Property Area As String
12 Property HDType As String
13 Property Language As String
14 Property Subtitle As String
15 Property Format As String
16 Property FileSize As String
17 Property Duration As String
18 Property Director As String
19 Property Actors As String
20 Property Summary As String
21 Property Hits As Int32
22 Property PlayCount As Int32
23 Property CreationDate As Date
24 Property Creator As String
25 Property IsRecommendation As Boolean
26 Property RecommendationDate As String
27 Property Score As Decimal
28
29 End Class
MvcMovieStore mvc5.0,EF6.01

这里面的每一个属性最终都会被解释成为数据表的一个字段,每个字段的意思不需要我再来解释了吧(如果真不明白的话就用谷歌翻译,或者必应翻译)。

向Movie模型中添加验证规则

现在开始向Movie类添加一些验证逻辑,利用内置的Required、 StringLength、RegularExpression和Range的验证特性,来更新刚才建好的Movie类,结果如下代码:

MvcMovieStore mvc5.0,EF6.01
Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations
Imports System.ComponentModel.DataAnnotations.Schema
Imports System.Globalization
Imports System.Data.Entity
Imports System.Security.Claims
Imports Microsoft.AspNet.Identity.EntityFramework
Imports Microsoft.AspNet.Identity
Imports System.Threading
Imports Microsoft.AspNet.Identity.Owin Public Class Movie <Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), ScaffoldColumn(False)> Property MovieID As Guid
<Required, Display(Name:="频道")> Property ChannelID As Guid
<Required, Display(Name:="频道分类")> Property Categories As String
<Required, StringLength(100), Display(Name:="海报")> Property Poster As String
<Required, StringLength(100), Display(Name:="剧照")> Property Still As String
<Required, StringLength(50), Display(Name:="片名")> Property Title As String
<StringLength(50), Display(Name:="译名")> Property TranslationTitle As String
<Required, StringLength(5), Display(Name:="年代")> Property ReleaseYear As String
<Required, StringLength(20), Display(Name:="区域")> Property Area As String
<Required, StringLength(20), Display(Name:="画质")> Property HDType As String
<Required, StringLength(20), Display(Name:="语言")> Property Language As String
<Required, StringLength(20), Display(Name:="字幕")> Property Subtitle As String
<StringLength(20), Display(Name:="格式")> Property Format As String
<StringLength(20), Display(Name:="大小")> Property FileSize As String
<StringLength(20), Display(Name:="时长")> Property Duration As String
<StringLength(100), Display(Name:="导演")> Property Director As String
<Display(Name:="演员")> Property Actors As String
<Display(Name:="简介"), Required, AllowHtml> Property Summary As String
<Required, Display(Name:="热度")> Property Hits As Int32
<Required, Display(Name:="播放次数")> Property PlayCount As Int32
<Required, Display(Name:="创建日期")> Property CreationDate As Date
<Required, StringLength(20), Display(Name:="创建者")> Property Creator As String
<Required, Display(Name:="推荐")> Property IsRecommendation As Boolean
<StringLength(20), Display(Name:="推荐日期"), ScaffoldColumn(False)> Property RecommendationDate As String
<Required(ErrorMessage:="必填"), Display(Name:="评分"), Range(1, 10, ErrorMessage:="介于1~10之间")>
<RegularExpression("^[-+]?[0-9]*\.?[0-9]+$", ErrorMessage:="格式无效")> Property Score As Decimal End Class
MvcMovieStore mvc5.0,EF6.01

验证属性是指要执行它们应用到模型属性上面的行为。 这里我们仅列出比较常用的几种Model验证属性:

  • Required和MinimumLength 属性指示属性必须有一个值 ;
  • Range属性限制必须为指定范围内的值。
  • StringLength属性允许您设置一个字符串属性的最大长度和其最小长度(可选)。
  • 值类型的属性 (例如decimal, int, float, DateTime)本身就有默认值,所以不需要在专门使用Required 验证属性。

Movie类已经建好了,其他数据实体类我是都写在MvcMovieStoreModels.vb这个文件中了,当然你也可以分开来写(一个文件中只有一个类)。下面是MvcMovieStore项目用到的所有数据实体模型类的源码,可以 点击下载

之后呢,就是上面遗留下来的问题,我们需要让这些实体类与我们的数据上下文进行关联,就是在ApplicationDbContext类中添加以下属性代码:

MvcMovieStore mvc5.0,EF6.01
 1     Property Movies As DbSet(Of Movie)
2
3 Property Channels As DbSet(Of Channel)
4 Property Categories As DbSet(Of Category)
5 Property ChannelCategoryMaps As DbSet(Of ChannelCategoryMap)
6 Property MovieCategoryMaps As DbSet(Of MovieCategoryMap)
7 Property Areas As DbSet(Of Area)
8 Property ReleaseYears As DbSet(Of ReleaseYear)
9 Property HDTypes As DbSet(Of HDType)
10 Property Actors As DbSet(Of Actor)
11 Property Actormaps As DbSet(Of Actormap)
12 Property Posters As DbSet(Of Poster)
13 Property Scores As DbSet(Of Score)
14 Property DownloadUrls As DbSet(Of DownloadUrl)
15 Property Comments As DbSet(Of Comment)
16
17 Property Carousels As DbSet(Of Carousel)
MvcMovieStore mvc5.0,EF6.01

至此,数据上下文和数据实体模型就建好了,后面将介绍如何使用这些数据实体类,进行CRUD操作。敬请等待后续…

说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC影视(MvcMovie.cn) 进行查阅。如需转载,请注明出处:http://www.cnblogs.com/DoduNet/,或加入 MvcMovieStore 群进行讨论:MvcMovieStore mvc5.0,EF6.01