MVC5 + EF6 完整入门教程三

摘要:
期待已久的EF终于到来了。学习本文后,您将掌握基于EF数据模型的完整开发过程。这一次,将完成EF数据模型的构建和使用。更多转弯和一个弯道的性能和灵活性肯定会受到影响,因此MVC+ADO也将在本系列文章NET的末尾给出,您可以根据需要进行选择。注:微软正式推出的ORM框架主要包括LinqtoSQL和Entity Framework EF,这是最新的和推荐的MVC框架。创建Initializer,使用EF初始化数据库,并插入示例数据EF以各种方式建立数据库。

期待已久的EF终于来了。

学完本篇文章,你将会掌握基于EF数据模型的完整开发流程。

本次将会完成EF数据模型的搭建和使用。

基于这个模型,将之前的示例添加数据库查询验证功能。

文章提纲

概述 & 要点

详细步骤

总结

概述 & 要点

下面是本文要点,正文部分会有详细介绍。

  • EF架构图
  • 新建基于EF的Data Model的约定
  • 关于ORM的重要概念,和传统方式开发的区别
  • EF开发的整体过程
详细步骤
  • 新建文件夹,规划好代码摆放位置
  • 创建相关类 (Data Model)
  • 创建 Database Context
  • 创建Initializer, 使用EF初始化数据库,插入示例数据
  • 完成数据库查询验证

新建文件夹,规划好代码摆放位置

  1. 根目录下新建一个 ViewModels文件夹。

           Models文件夹里面存放对应于数据库表的实体。

           View中需要显示的数据和Models中实体模型不一定能对应上, 因此需要专门给View使用的自定义数据模型,我们称之为ViewModel , 放在ViewModels文件夹里面。

  1. 根目录下新建一个DAL 文件夹。

           DAL 放置数据访问相关类。

            NOTE 本文中放AccountContext.cs, AccountInitializer.cs

MVC5 + EF6 完整入门教程三第1张

创建相关类(Data Model)

为了更加贴近真实情况,我们针对用户建立三个相关的类。

SysUser, SysRole, SysUserRole

这是用户权限管理RBAC (Role – Based Access Control)的一个典型模型, 更复杂的模型都可以在这个基础上进行扩展。

OK,下面我们就开始新建这个模型。

我们先去网上找个大致的关系图做参考,打开百度,输入 user role , 搜索图片。

挑一个类似的做参考。

MVC5 + EF6 完整入门教程三第2张

NOTE 权限相关是系统管理范畴的,不涉及具体业务,我起名字的时候都加了Sys前缀,这样和业务区隔开来。

参考上面这个图建立 Data Model

SysUser Entity

MVC5 + EF6 完整入门教程三第3张

SysRole Entity

MVC5 + EF6 完整入门教程三第4张

SysUserRole Entity

MVC5 + EF6 完整入门教程三第5张

对于上面几个类的约定和说明:

  1. EF生成数据库时,ID 属性将会成为主键。(约定:EF默认会将ID或classnameID生成主键, MSDN建议保持风格的一致性, 都用ID或classnameID, 我们这里都用ID)
  2. EF 生成数据库时 , <navigation property name><primary key property name>这种形式的会成为外键. ( 约定 )

    例如外键 SysUserID = SysUser(navigation property)+ID(SysUser的主键)

  3. 定义为virtual的几个属性是 navigation 属性(virtual非必须, 只是惯例用法, 后面文章将会讲解用virtual的好处).

    navigation 属性保存着其他的关联entity(entities)

    示例中, SysUser和SysUserRole是一对多的关系, SysRole和SysUserRole也是一对多的关系.

    如果是 "多", 属性类型就必须是list( 这里用的是Icollection )

创建 Database Context

前置条件:安装EF

打开 工具à库程序包管理器à程序包管理器控制台

输入 install-package entityframework

MVC5 + EF6 完整入门教程三第6张

MVC5 + EF6 完整入门教程三第7张

去MSDN上查看下EF的架构图:http://msdn.microsoft.com/en-us/data/aa937709

MVC5 + EF6 完整入门教程三第8张

从上图可以看出,EF框架在底层是通过调用ADO.NET来实现数据库操作的。

多转一道弯性能和灵活性肯定会受到影响,所以本系列文章结束后同样也会给出MVC+ADO.NET的方案,大家可以根据需要选择。

NOTE

微软官方推出的ORM框架主要有Linq to SQL和Entity Framework.

EF是目前最新的,也是推荐配合MVC使用的框架。

实际操作前再补充一些重要概念:

如果不用ORM框架,我们一般这样来使用ADO.NET进行数据库开发:

  1. 将ADO.NET对数据库的操作封装到一个类里SqlHelper中
  2. 在DAL层调用SqlHelper
  3. 其他层再调用DAL进行数据库操作

使用ORM之后,以前面的SysUser为例:

O(Object) à 程序中的类 SysUser, 就是对象

R (Relation)à 数据库中的表

M(Mapping)à O和R的映射关系

ORM对传统方式的改进:

充当桥梁,实现了关系数据和对象数据的映射,通过映射自动产生SQL语句。

对常用的操作,节省了写SQL语句的步骤。

好了,现在必要的概念应该理解了吧,下面我们就进行实际的操作了。

创建类 AccountContext.cs , 让他继承自System.Data.Entity.DbContext, 我们用这个类完成EF的功能。

MVC5 + EF6 完整入门教程三第9张

主要做下面三件事:

  1. 为每个entity set创建一个DbSet

    在EF中,通常情况下一个entity set对应数据库中的一张表,一个entity对应表中的一行。

  2. 指定一个连接字符串

    构造函数中的 base("AccountContext") 。

    默认情况下和类名一样,即AccountContext,我们显式的给他指定出来。

  3. 指定单数形式的表名

    >();

    默认情况下会生成复数形式的表,如SysUsers

    NOTE 表名用单复数形式看各自的习惯,没有明确的规定。有的公司表名全用单数,有的公司根据表的意思,有单数也有复数。

MVC5 + EF6 完整入门教程三第10张

配合上面第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>

MVC5 + EF6 完整入门教程三第11张

NOTE AttachDBFilename=|DataDirectory|MVCDemo.mdf设定了数据库文件的存放位置:在项目根目录的App_Data文件夹下。

创建Initializer, 使用EF初始化数据库,插入示例数据

EF可以以多种方式建立数据库。

我们采用如下方式:

第一次运行程序时新建数据库,插入测试数据; model改变(和database不一致)时删除重建数据库,插入测试数据。

目前在开发阶段,不用管数据丢失的问题,直接drop and re-create比较方便。

等系列文章结束后会讲解生产环境中如何不丢失数据修改schema

下面我们就新建类AccountInitializer.cs来完成这个工作。

MVC5 + EF6 完整入门教程三第12张

Seed方法用我们之前定义的database context(即AccountContext) 作为参数,通过这个context将entities添加到database中去。(就是我们前面说的桥梁作用)

从上面代码可以看出, Seed方法对每一个entity的类型(我们用了SysUser和SysRole, SysUserRole我们暂不添加):

创建一个colletion à 添加到适当的 DbSet property à 保存到数据库。

NOTE 不一定要在每个entity组后面都调用SaveChanges方法,可以在所有组结束后调用一次也可以。这样做是因为如果写入数据库代码出错,比较容易定位代码的错误位置。

修改web.config, 通知EF使用我们刚刚写好的initializer类。

找到entityFramework配置节,添加下图方框处内容。

MVC5 + EF6 完整入门教程三第13张

context 配置节中, type 的值对应 (context class的完整描述,程序集)

databaseInitializer 配置节中 , type 的值对应 (initializer class 的完整描述,程序集)

NOTE : 如果你不想EF使用某个context, 可以将下面方框处设置为true.

MVC5 + EF6 完整入门教程三第14张

完成数据库查询验证

现在EF一切就绪.

运行程序,当第一次连接数据库时,EF比较model(AccountContext和entity classes) 和database. 如果两边不一致,程序将会drop and re-create数据库。

因为目前我们还没有连接数据库的操作,所以EF还没发挥作用。

现在我们完成前面的Login功能。

  1. 先做点小修改,在ModelsàSysUser.cs里面添加个Email字段。

    同样DALàAccountInitializer.csàSeed里面示例数据也要增加这个字段

MVC5 + EF6 完整入门教程三第15张

MVC5 + EF6 完整入门教程三第16张

NOTE 添加一个Email是因为之前的登录页面填入的是Email值,后面将会输入Email和Password到数据库中进行比对。

  1. 打开Controllers à AccountController.cs
    1. Instantiate 一个database context 对象
    2. 修改HttpPost类型的Login Action,查询数据库进行比对。

NOTE

用过SQL的人都知道,学习SQL,最复杂的是查询,把各种查询学好了,基本就掌握70%以上了。

EF数据模型的数据操作也一样,重点是查询,下篇文章会展开讲。(从简单查询到条件、聚合、连接等复杂查询都会涉及到)

MVC5 + EF6 完整入门教程三第17张

运行Login.cshtml页面,输入正确的和错误的登录信息验证下。

MVC5 + EF6 完整入门教程三第18张

MVC5 + EF6 完整入门教程三第19张

另外再检查一下数据库部分是否符合我们的预期:

  1. 打开数据库,发现MVCDemo这个数据库已经新建,示例数据已经插入。
  2. 打开项目的App_Data 文件夹,发现数据库文件已经存在。

    MVC5 + EF6 完整入门教程三第20张

    MVC5 + EF6 完整入门教程三第21张

免责声明:文章转载自《MVC5 + EF6 完整入门教程三》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux —— 编译linux内核java 字符串中参数化符号${}的解析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

GIS中的数据库.gdb与.mdb的区别

gdb是文件地理数据库,mdb是个人地理数据库,都是数据库文件类型。 个人地理数据库,是以access数据库为基础的个人将数据库格式mdb,可以存储不超过2G的文件,只适合Windows系统下; 文件数据库是在文件系统文件夹中保存的各种类型的GIS数据集的集合。 参考文章 GIS中的数据库.gdb与.mdb的区别在哪,m892832piczpec5。...

Django之路第四篇:Models

概述 通常,一个Model对应数据库的一张数据表 Django中Models以类的形式展现 它包含了一些基本字段以及数据的一些行为 ORM Django使用了对象关系映射-----ORM(Object Relation Mapping) 实现了对象和数据库之间的映射 隐藏了数据访问的细节,不需要编写SQL语句 编写Models的步骤 在应用根目录...

关于使用SqlSugar插入数据异常解决方案

 项目的解决方案中引用的有mysqlsugar的数据库操作库,在使用插入数据过程中一些特殊的生僻字或表情符号总会提示: Incorrect string value: 'xF0x9F...' for column 'name' at row 1 这是由于UTF-8编码有可能是两个、三个、四个字节。Emoji表情或者某些特殊字符是4个字节,而MySQL的ut...

MongoDB 不断发展:发布 1.4 版本,10gen 提供商业支持

3 月25日 MongoDB(取自“humongous”)1.4 版发布 后不久,其创始人Dwight Merriman(前DoubleClick CEO/CTO)宣布10gen —— 开源文档数据库MongoDB背后的公司,将为其提供商业培训和支持。 InfoQ借此机会采访了Merriman,了解了MongoDB的特性、适用性以及在NoSQL数据库社区中...

Golang 编码规范

原文链接:https://github.com/golang/go/wiki/CodeReviewComments1)用 goimport 代替 gofmt2) https://golang.org/doc/effective_go.html#commentary注释单独一行,开始于描述的名字,结束于。。没看明白3)context.Context的值包含:...

python ORM框架:SqlAlchemy

  ORM,对象关系映射,即Object Relational Mapping的简称,通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系,这样做的目的:简化sql语言操作数据库的繁琐过程(原生sql的编写及拼接等),转而直接使用对象模型来操作数据库做替代 第一部分       SqlAlchemy本身无法直接操作数据库,它是建立在第三...