MVC5 + EF6 完整入门教程三

MVC5 + EF6 完整入门教程三
原文:MVC5 + EF6 完整入门教程三

期待已久的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

创建相关类(Data Model)

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

SysUser, SysRole, SysUserRole

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

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

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

挑一个类似的做参考。

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

参考上面这个图建立 Data Model

SysUser Entity

SysRole Entity

SysUserRole Entity

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

  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

去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进行数据库开发:

  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的功能。

主要做下面三件事:

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

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

  2. 指定一个连接字符串

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

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

  3. 指定单数形式的表名

    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

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

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

配合上面第2点,先把web.config中连接字符串给指定了。

如下图,贴着appSettings配置节上面添加。

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

 

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

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功能。

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

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

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

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

NOTE

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

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

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

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

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

     

总结

OK,到此为止,我们搭建好了EF框架,进行了数据库的初始化,查询了一条用户信息。

需要说明的是,现在的登录功能还比较简陋,不是真正的登录功能(例如输入项还缺少验证,密码还没有加盐),只是为了说明EF的用法。根据系列文章讲述知识点的需要,最终会实现完整功能。

最后再回顾下本篇文章的重点:掌握使用EF开发的整个过程。

创建Data Modelà创建Database Context à创建databaseInitializerà配置entityFramework的context配置节

希望大家能清晰的了解上面整个过程,理解每一个过程的作用。

 

好了,本次文章就到这里。

欢迎大家多提问题多评论,让下一篇文章更好 :)

posted on 2015-05-21 11:19 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/4519209.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纯手写的css3正方体旋转效果

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>css3旋转立方体效果</title><style type"text/css">*{margin: 0;padding: 0;}.box{width: 400px;height: 400px;border: 1px solid #000;margin: 30p…

Expect 教程中文版

http://blog.csdn.net/chinalinuxzend/article/details/1842588原贴&#xff1a;http://blog.chinaunix.net/u/13329/showart.php?id110100 Expect 教程中文版[From] http://www.linuxeden.com/edu/doctext.php?docid799  本教程由*葫芦娃*翻译&#xff0c;并做…

java boolean转int,java如何将int转换为boolean

When i convert:int B1;boolean AB;It gives error: Incompatible types, which is trueBut when I write this code:int C0;boolean AC1;it gives falsewhile if I change value of C to 1 it gives true.I dont understand how compiler is doing it.解决方案int C0;boolean …

习惯看新闻头条 一个程序员分享的工作心得

原本想找链接的。可是...我还是选择手打 原作者&#xff1a;刘鹏看未来 原文标题 10程序员总结的20条经验教训 开发 1.从小事做起&#xff0c;然后再扩展 无论是创建一个新的系统&#xff0c;还是添加功能到现有的系统中&#xff0c;我总是从一个简单到几乎任何所需功能的版…

Java-JUC(十):线程按序交替执行

问题&#xff1a; 有a、b、c三个线程&#xff0c;使得它们按照abc依次执行10次。 实现&#xff1a; package com.dx.juc.test;import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public…

IntelliTrace 调试、定位异常

最近看了一个开源数据库管理&#xff0c;然后没有认真看它的配置环境&#xff0c;想看看是什么东西&#xff0c; 然后发现有类型转换的错误&#xff0c;但是一下子也定位不到哪里出错&#xff1f; 所以对于这种一下子找不到异常在哪里的&#xff0c;可以使用intellitrace智能跟…

java referencemap_Java中TypeReference用法说明

来源于&#xff1a;https://blog.csdn.net/zhuzj12345/article/details/102914545在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference&#xff0c;例如&#xff1a;void testTypeReference() {List list new ArrayList<>();list.add(1);list.add(9)…

zedboard--zynq使用自带外设IP让ARM PS访问FPGA(八) 转载

文章来源 http://blog.chinaaet.com/detail/34609 熟悉了xps的操作&#xff0c;IP添加&#xff0c;总线连接设置&#xff0c;图形化方法检查&#xff08;open graphical design view&#xff09;&#xff0c;检查总线及端口连接。 在file下面的图标中&#xff0c;打开导出到SDK…

[php入门] 4、HTML基础入门一篇概览

[php入门] 1、从安装开发环境环境到&#xff08;庄B&#xff09;做个炫酷的登陆应用 [php入门] 2、基础核心语法大纲 [php入门] 3、WAMP中的集成MySQL相关基础操作 1、HTML的作用   HTML是超文本标记语言&#xff0c;主要用于制作页面结构&#xff1b;而经常与之一起用的CSS是…

Python3 爬虫爬取中国图书网(淘书团) 记录

本人为一名刚开始学Python爬虫的小白&#xff0c;开贴仅为记录下自己的学习历程&#xff0c;方便做review 要爬取链接&#xff1a;http://tuan.bookschina.com/ 要爬取内容&#xff1a; 图书名称&#xff0c; 图书价格&#xff0c; 以及对应预览图的link 本文用到py packages: …

java连接字符串_Java如何连接字符串

Java中的连接是将两个字符串连接在一起的操作。您可以使用加()运算符或String的concat ()方法来连接字符串。使用运算符使用运算符是在Java中连接两个字符串的最常用方法。您可以提供变量&#xff0c;数字或字符串文字(始终用双引号括起来)。例如&#xff0c;要组合字符串“I’…

移动Web应用程序开发HTML5篇

https://software.intel.com/zh-cn/blogs/2012/03/09/webhtml5-offline-web-applications转载于:https://www.cnblogs.com/wln3344/p/4521909.html

分布式之延时任务方案解析

每天学习一点点 编程PDF电子书、视频教程免费下载&#xff1a;http://www.shitanlife.com/code引言 在开发中&#xff0c;往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付&#xff0c;则自动取消生成订单60秒后,给用户发短信对上述的任务&#xff0c;我们给一个专…

linux命令学习

Make 命令 http://www.cnblogs.com/peida/tag/%E6%AF%8F%E6%97%A5%E4%B8%80linux%E5%91%BD%E4%BB%A4/ 1 [developmentwww /]$ cd ————直接回到自己的主目录。 2 软件安装步骤 1、configure&#xff0c;这一步一般用来生成 Makefile&#xff0c;为下一步的编译做准备&#…

mysql 搭建日志服务器_一、架构01-搭建日志服务器Rsyslog

搭建日志服务器1、环境配置环境&#xff1a;node01 192.168.32.132 rsyslog服务器node02 192.168.32.128 rsyslog客户端2、node01、node02安装rsyslog软件包[rootnode01 ~]# yum install -y rsyslog[rootnode02 ~]# yum install -y rsyslog3、修改node01上rsyslog的配置文件…

使用了BeanUtils的简单操作

直接获取对象的某个值et.createCell(BeanUtils.getProperty(o, eh.getFieldName())); 简单为对象某个字段赋值c.setCellValue(BeanUtils.getProperty(datas.get(i),headers.get(j).getFieldName())); beanUtils的底层是内省。下面是又一个小例子&#xff0c;实现了map和bean的映…

NTP服务器

随着计算机网络的迅猛发展&#xff0c;网络应用已经非常普遍&#xff0c;众多的领域的网络系统&#xff0c;如电力&#xff0c;石化&#xff0c;金融业&#xff08;证券&#xff0c;银行&#xff09;&#xff0c;广电业&#xff08;广播&#xff0c;电视&#xff09;&#xff0…

ところが

ところが 1表示确定顺接条件&#xff0c;连接两个并存的事项&#xff0c;前项为后项的契机&#xff0c;相当于たら的部分用法  あしたは晴れるだろうと思って寝たが、翌朝起きてみたところ、やっぱり晴れていた。 2表示确定逆接条件&#xff0c;后项往往是与自己的意愿相反的…

mysql 永真_sql注入

Sql注入Sql注入成因&#xff1a;1)转义字符处理不当(如’,--,/**/,会截断原有的语句&#xff0c;执行新语句)&#xff1b;2)类型处理不当(如接受的是整型的参数&#xff0c;并没有校验也可以接受字符型数据)3)查询语句的组装不当4)错误处理不当5)权限配置不当(可以执行高权限语…

吐槽《黑客与画家》

书呆子与骚年 看到本书有关书呆子的描述时&#xff0c;反观自身&#xff0c;有很多感同身受的东西。从小我在大家眼里就是一个安静孤僻的书呆子&#xff0c; 外号“阴天使&#xff08;方言的谐音&#xff09;”。也由于安静的性格&#xff0c;使得我能坐得住安静地读书&#xf…