期待已久的EF终于来了。 html
学完本篇文章,你将会掌握基于EF数据模型的完整开发流程。 前端
本次将会完成EF数据模型的搭建和使用。 web
基于这个模型,将以前的示例添加数据库查询验证功能。 数据库
概述 & 要点 架构
详细步骤 app
总结 框架
下面是本文要点,正文部分会有详细介绍。 ide
Models文件夹里面存放对应于数据库表的实体。 函数
View中须要显示的数据和Models中实体模型不必定能对应上, 所以须要专门给View使用的自定义数据模型,咱们称之为ViewModel , 放在ViewModels文件夹里面。 工具
DAL 放置数据访问相关类。
NOTE 本文中放AccountContext.cs, AccountInitializer.cs
为了更加贴近真实状况,咱们针对用户创建三个相关的类。
SysUser, SysRole, SysUserRole
这是用户权限管理RBAC (Role – Based Access Control)的一个典型模型, 更复杂的模型均可以在这个基础上进行扩展。
OK,下面咱们就开始新建这个模型。
咱们先去网上找个大体的关系图作参考,打开百度,输入 user role , 搜索图片。
挑一个相似的作参考。
NOTE 权限相关是系统管理范畴的,不涉及具体业务,我起名字的时候都加了Sys前缀,这样和业务区隔开来。
参考上面这个图创建 Data Model
SysUser Entity
SysRole Entity
SysUserRole Entity
对于上面几个类的约定和说明:
例如外键 SysUserID = SysUser(navigation property)+ID(SysUser的主键)
navigation 属性保存着其余的关联entity(entities)
示例中, SysUser和SysUserRole是一对多的关系, SysRole和SysUserRole也是一对多的关系.
若是是 "多", 属性类型就必须是list( 这里用的是Icollection )
前置条件:安装EF
打开 工具à库程序包管理器à程序包管理器控制台
输入 install-package entityframework
去MSDN上查看下EF的架构图:http://msdn.microsoft.com/en-us/data/aa937709
从上图能够看出,EF框架在底层是经过调用ADO.NET来实现数据库操做的。
多转一道弯性能和灵活性确定会受到影响,因此本系列文章结束后一样也会给出MVC+ADO.NET的方案,你们能够根据须要选择。
NOTE
微软官方推出的ORM框架主要有Linq to SQL和Entity Framework.
EF是目前最新的,也是推荐配合MVC使用的框架。
实际操做前再补充一些重要概念:
若是不用ORM框架,咱们通常这样来使用ADO.NET进行数据库开发:
使用ORM以后,之前面的SysUser为例:
O(Object) à 程序中的类 SysUser, 就是对象
R (Relation)à 数据库中的表
M(Mapping)à O和R的映射关系
ORM对传统方式的改进:
充当桥梁,实现了关系数据和对象数据的映射,经过映射自动产生SQL语句。
对经常使用的操做,节省了写SQL语句的步骤。
好了,如今必要的概念应该理解了吧,下面咱们就进行实际的操做了。
建立类 AccountContext.cs , 让他继承自System.Data.Entity.DbContext, 咱们用这个类完成EF的功能。
主要作下面三件事:
在EF中,一般状况下一个entity set对应数据库中的一张表,一个entity对应表中的一行。
构造函数中的 base("AccountContext") 。
默认状况下和类名同样,即AccountContext,咱们显式的给他指定出来。
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
默认状况下会生成复数形式的表,如SysUsers
NOTE 表名用单复数形式看各自的习惯,没有明确的规定。有的公司表名全用单数,有的公司根据表的意思,有单数也有复数。
配合上面第2点,先把web.config中链接字符串给指定了。
以下图,贴着appSettings配置节上面添加。注意要web.config中要加上红字部分,不然会出错。
<
connectionStrings
>
<
add
name="AccountContext" connectionString="Data Source=.;database=MvcDemo;uid=sa;pwd=123456;AttachDBFilename=|DataDirectory|\MvcDemo.mdf;" providerName="System.Data.SqlClient"/>
</
connectionStrings
>
NOTE AttachDBFilename=|DataDirectory|\MVCDemo.mdf设定了数据库文件的存放位置:在项目根目录的App_Data文件夹下。
EF能够以多种方式创建数据库。
咱们采用以下方式:
第一次运行程序时新建数据库,插入测试数据; model改变(和database不一致)时删除重建数据库,插入测试数据。
目前在开发阶段,不用管数据丢失的问题,直接drop and re-create比较方便。
等系列文章结束后会讲解生产环境中如何不丢失数据修改schema
下面咱们就新建类AccountInitializer.cs来完成这个工做。
Seed方法用咱们以前定义的database context(即AccountContext) 做为参数,经过这个context将entities添加到database中去。(就是咱们前面说的桥梁做用)
从上面代码能够看出, Seed方法对每个entity的类型(咱们用了SysUser和SysRole, SysUserRole咱们暂不添加):
建立一个colletion à 添加到适当的 DbSet property à 保存到数据库。
NOTE 不必定要在每一个entity组后面都调用SaveChanges方法,能够在全部组结束后调用一次也能够。这样作是由于若是写入数据库代码出错,比较容易定位代码的错误位置。
修改web.config, 通知EF使用咱们刚刚写好的initializer类。
找到entityFramework配置节,添加下图方框处内容。
context 配置节中, type 的值对应 (context class的完整描述,程序集)
databaseInitializer 配置节中 , type 的值对应 (initializer class 的完整描述,程序集)
NOTE : 若是你不想EF使用某个context, 能够将下面方框处设置为true.
如今EF一切就绪.
运行程序,当第一次链接数据库时,EF比较model(AccountContext和entity classes) 和database. 若是两边不一致,程序将会drop and re-create数据库。
由于目前咱们尚未链接数据库的操做,因此EF还没发挥做用。
如今咱们完成前面的Login功能。
一样DALàAccountInitializer.csàSeed里面示例数据也要增长这个字段
NOTE 添加一个Email是由于以前的登陆页面填入的是Email值,后面将会输入Email和Password到数据库中进行比对。
NOTE
用过SQL的人都知道,学习SQL,最复杂的是查询,把各类查询学好了,基本就掌握70%以上了。
EF数据模型的数据操做也同样,重点是查询,下篇文章会展开讲。(从简单查询到条件、聚合、链接等复杂查询都会涉及到)
运行Login.cshtml页面,输入正确的和错误的登陆信息验证下。
另外再检查一下数据库部分是否符合咱们的预期:
OK,到此为止,咱们搭建好了EF框架,进行了数据库的初始化,查询了一条用户信息。
须要说明的是,如今的登陆功能还比较简陋,不是真正的登陆功能(例如输入项还缺乏验证,密码尚未加盐),只是为了说明EF的用法。根据系列文章讲述知识点的须要,最终会实现完整功能。
最后再回顾下本篇文章的重点:掌握使用EF开发的整个过程。
建立Data Modelà建立Database Context à建立databaseInitializerà配置entityFramework的context配置节
但愿你们能清晰的了解上面整个过程,理解每个过程的做用。
好了,本次文章就到这里。
欢迎你们多提问题多评论,让下一篇文章更好 :)
为方便你们观看,列出系列文章地址: