原创: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这个文件,如下图所示:
从文件名我们大概可以理解为:身份模型,顾名思义就是说这个文件中应该是与我们这个项目所使用的身份认证有关的类或者设置。打开之后我们可以看到两个类:
Imports Microsoft.AspNet.Identity.EntityFramework ' 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.
Public Class ApplicationUser
Inherits IdentityUser
End Class Public Class ApplicationDbContext
Inherits IdentityDbContext(Of ApplicationUser)
Public Sub New()
MyBase.New("DefaultConnection")
End Sub
End Class
ApplicationUser:应用程序用户,ApplicationDbContext:应用程序数据上下文;
不错,项目默认已经为我们创建好了数据上下文,你可能会问现在这个类怎么不是继承的System.Data.Entity.Dbcontext呀?,那么,我们在IdentityDbContext处点击右键,选择转到定义,如下图所示:
之后会在工作区打开“对象浏览器”窗口,从这里可以很清楚的看出,IdentityDbContext的继承关系,没看错,他就是继承的System.Data.Entity.Dbcontext;如下图所示:
也就是说,我们的项目中已经有了一个数据上下文存在,那么我还需要再创建一个吗?,对于我们现有的项目,不需要多个数据库,一个就够我们用的了,所以答案是,不需要!需要的是我们对此进行扩充。我们现在来运行一下项目,看看这个数据上下文是不是真的有效。按F5运行项目,等待打开浏览器……,如下图所示:
我们在项目的web.config中默认提供了数据连接字符串,根据字符串我们知道数据库的位置应该是在项目根目录的app_Data文件夹,点击导航栏中的“注册”,并完成表单注册一个用户(想验证刚才提到的数据上下文是否有效,需要页面操作涉及到数据模型的操作时,mvc才会通过数据上下文自动创建数据库),如下图所示:
如注册成功后,会自动登陆,并转到首页,当看到导航栏右侧有欢迎词语时,说明我们已经注册成功!如下图所示:
那么打开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”)是如何创建,以及各个表中间的关系是我们这章的主要内容。
下面我们再来看一下数据结构拓扑图:
图中的每一个数据表都是一个数据实体,都是一个类,而每一个类都以特别的身份出现在上面我们讲到的数据上下文中。下面我们仅仅以“Movie”及与其相关联的几个实体为例来说明创建数据实体模型:
在解决方案资源管理器中找到 Models文件夹,点击右键依次选择:添加/类,如下图所示:
在新建类对话框的类名处输入:MvcMovieStoreModels.vb,之后会看到刚刚建好的类,如下图所示:
删除现有的代码,然后粘贴以下代码:
Public Class Movie Property MovieID As Guid
Property ChannelID As Guid
Property Categories As String
Property Poster As String
Property Still As String
Property Title As String
Property TranslationTitle As String
Property ReleaseYear As String
Property Area As String
Property HDType As String
Property Language As String
Property Subtitle As String
Property Format As String
Property FileSize As String
Property Duration As String
Property Director As String
Property Actors As String
Property Summary As String
Property Hits As Int32
Property PlayCount As Int32
Property CreationDate As Date
Property Creator As String
Property IsRecommendation As Boolean
Property RecommendationDate As String
Property Score As Decimal End Class
这里面的每一个属性最终都会被解释成为数据表的一个字段,每个字段的意思不需要我再来解释了吧(如果真不明白的话就用谷歌翻译,或者必应翻译)。
向Movie模型中添加验证规则
现在开始向Movie类添加一些验证逻辑,利用内置的Required、 StringLength、RegularExpression和Range的验证特性,来更新刚才建好的Movie类,结果如下代码:
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(), Display(Name:="海报")> Property Poster As String
<Required, StringLength(), Display(Name:="剧照")> Property Still As String
<Required, StringLength(), Display(Name:="片名")> Property Title As String
<StringLength(), Display(Name:="译名")> Property TranslationTitle As String
<Required, StringLength(), Display(Name:="年代")> Property ReleaseYear As String
<Required, StringLength(), Display(Name:="区域")> Property Area As String
<Required, StringLength(), Display(Name:="画质")> Property HDType As String
<Required, StringLength(), Display(Name:="语言")> Property Language As String
<Required, StringLength(), Display(Name:="字幕")> Property Subtitle As String
<StringLength(), Display(Name:="格式")> Property Format As String
<StringLength(), Display(Name:="大小")> Property FileSize As String
<StringLength(), Display(Name:="时长")> Property Duration As String
<StringLength(), 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(), Display(Name:="创建者")> Property Creator As String
<Required, Display(Name:="推荐")> Property IsRecommendation As Boolean
<StringLength(), Display(Name:="推荐日期"), ScaffoldColumn(False)> Property RecommendationDate As String
<Required(ErrorMessage:="必填"), Display(Name:="评分"), Range(, , ErrorMessage:="介于1~10之间")>
<RegularExpression("^[-+]?[0-9]*\.?[0-9]+$", ErrorMessage:="格式无效")> Property Score As Decimal End Class
验证属性是指要执行它们应用到模型属性上面的行为。 这里我们仅列出比较常用的几种Model验证属性:
- Required和MinimumLength 属性指示属性必须有一个值 ;
- Range属性限制必须为指定范围内的值。
- StringLength属性允许您设置一个字符串属性的最大长度和其最小长度(可选)。
- 值类型的属性 (例如decimal, int, float, DateTime)本身就有默认值,所以不需要在专门使用Required 验证属性。
Movie类已经建好了,其他数据实体类我是都写在MvcMovieStoreModels.vb这个文件中了,当然你也可以分开来写(一个文件中只有一个类)。下面是MvcMovieStore项目用到的所有数据实体模型类的源码,可以 点击下载。
之后呢,就是上面遗留下来的问题,我们需要让这些实体类与我们的数据上下文进行关联,就是在ApplicationDbContext类中添加以下属性代码:
Property Movies As DbSet(Of Movie) Property Channels As DbSet(Of Channel)
Property Categories As DbSet(Of Category)
Property ChannelCategoryMaps As DbSet(Of ChannelCategoryMap)
Property MovieCategoryMaps As DbSet(Of MovieCategoryMap)
Property Areas As DbSet(Of Area)
Property ReleaseYears As DbSet(Of ReleaseYear)
Property HDTypes As DbSet(Of HDType)
Property Actors As DbSet(Of Actor)
Property Actormaps As DbSet(Of Actormap)
Property Posters As DbSet(Of Poster)
Property Scores As DbSet(Of Score)
Property DownloadUrls As DbSet(Of DownloadUrl)
Property Comments As DbSet(Of Comment) Property Carousels As DbSet(Of Carousel)
至此,数据上下文和数据实体模型就建好了,后面将介绍如何使用这些数据实体类,进行CRUD操作。敬请等待后续…
说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC影视(MvcMovie.cn) 进行查阅。如需转载,请注明出处:http://www.cnblogs.com/DoduNet/,或加入 MvcMovieStore 群进行讨论:
原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 4、创建数据上下文和数据实体模型的更多相关文章
- 原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 2、数据框架 和 功能预览
说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC 影视(MvcMovie.cn) 进行查阅.如需转载,请注明出处:http://www.cnblogs.com/Dod ...
- 原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 1、初露锋芒
说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC 影视(MvcMovie.cn) 进行查阅.如需转载,请注明出处:http://www.cnblogs.com/Dod ...
- 原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 3、创建项目
说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC 影视(MvcMovie.cn) 进行查阅.如需转载,请注明出处:http://www.cnblogs.com/Dod ...
- MvcMovieStore mvc5.0,EF6.01
MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 4.创建数据上下文和数据实体模型 说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登 ...
- PHP: 手把手编写自己的 MVC 框架实例教程
1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...
- php实现最简单的MVC框架实例教程
本文以一个实例的形式讲述了PHP实现MVC框架的过程,比较浅显易懂.现分享给大家供大家参考之用.具体分析如下: 首先,在学习一个框架之前,基本上我们都需要知道什么是mvc,即model-view-co ...
- MVC框架实例教程 【转载】
1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...
- 手把手编写自己的PHP MVC框架实例教程
1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式. MVC把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Contro ...
- 手把手编写PHP MVC框架实例教程
源地址:https://www.awaimai.com/128.html#comment-27466 这个不错,用php实现mvc最核心功能,代码量只有几十K. 其实,不管用那种方法,最终都是incl ...
随机推荐
- [原创][C#.Winform 控件]Krypton Suite comments
命名空间:ComponentFactory.Krypton.Toolkit 最新版本:v4.4.0 官网状态:已停用 下载地址1:http://downloads.informer.com/krypt ...
- WebDriverAgent原理
传输层:HTTP/HTTPS/HSF/Socket 安全性:HTTP/HTTPS 功能.单元 性能-限流.加服务器 目的:稳定的服务的TPS摸高测试(短时间的极限,不可持续) API接口测试-施压-服 ...
- SSH&SFTP服务分离+家目录锁定
Step 1 在root用户下创建维护账号的家目录,此处以创建userftp帐号的家目录为例. mkdir -p /chroot/home/user Step 2 在root用户根目录下执行以下命令设 ...
- json中key大小写转换
最近工作中遇到json格式的字符串中的key为大写的,需要转换成小写的来解析,开始想使用正则来替换,结果不是很方便,后来考虑把JSONObject重新来封装. 如下json格式:{PWACHECKIN ...
- 基于Redis实现简单的分布式锁
在分布式场景下,有很多种情况都需要实现最终一致性.在设计远程上下文的领域事件的时候,为了保证最终一致性,在通过领域事件进行通讯的方式中,可以共享存储(领域模型和消息的持久化数据源),或者做全局XA ...
- hdu-4432-Sum of divisors
/* Sum of divisors Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- oracle ora-01652无法通过128(在表空间xxx中)扩展 问题解决方式
问题原因建立的表空间dbf文件大小上限了 一. select * from dba_data_files 使用该条语句可以查看当前库中有多少表空间并且DBF文件的存储位置 二.查看表空间是否开启了自动 ...
- EF CodeFirst生成数据库到Sqlserver中
EF CodeFirst简单实例这篇文章介绍了如何用EF去快速生成数据库.但是这个并没有生成到sqlserver中,总觉得不爽.下面就来讲一下,如何将数据库生成到sqlserver中. 按照EF Co ...
- Redis RDB文件
[Redis RDB文件] 1.RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). RDB 的优点 RDB 是一个非常紧凑(compact)的 ...
- SpringMvc配置拦截器
SpringMVC可以通过配置拦截器,进行url过滤等处理. 在spring-mvc.xml的配置文件中,如下示: 其中,在<mvc:interceptors>中可以配置多个拦截器< ...