MVC5+EF6 入门完整教程四

article/2025/10/19 13:34:08


上篇文章主要讲了如何配置EF, 我们回顾下主要过程:

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

对这个过程还有疑问的可以去上篇再看一下。

本次我们就主要讲解 (1) EF基本的CRUD (2) 涉及到的常用HtmlHelper


文章提纲


概述 & 要点

理论基础

详细步骤

总结


概述 & 要点


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

  • EF数据模型的CRUD
  • 常用的HtmlHelper
  • Repository Pattern


理论基础 -- EF 三种编程方式 (略)


总共有三种方式:

Database First,Model First和Code First,我们采用的是code first.

这方面资料很多,我就不重复讲述了, 需要了解这三者差异和应用场景的请自行查阅其他资料。


理论基础 -- EF CRUD


针对之前创建的SysUser, SysRole, SysUserRole举一些典型例子,基本的CRUD大家在使用时模仿这些例子就可以了。

我们要用的数据库示例数据分别如下:    

SysUser

SysRole

SysUserRole

EF数据查询

先讲使用频率最高的查询部分。     

EF数据查询用LINQ实现(LINQ to Entities),通常有表达式和函数式两种方式。建议用函数式方式,比较简单。

假设我们已经定义好了context

privateAccountContext db =newAccountContext();

  1. [基本查询] 查询所有的SysUser

    

        var users =from uin db.SysUsersselect u;//表达式方式users = db.SysUsers;//函数式方式

  1. [条件查询] 加入查询条件

  

      users =from uin db.SysUserswhere u.UserName =="Tom"select u;//表达式方式users = db.SysUsers.Where(u => u.UserName =="Tom");//函数式方式

    NOTE 注意这边等号是C#写法 :" =="

  1. [排序和分页查询]

    

        users = (from uin db.SysUsersorderby u.UserNameselect u).Skip(0).Take(5);//表达式方式users = db.SysUsers.OrderBy(u => u.UserName).Skip(0).Take(5);//函数式方式

    NOTE 只有排序了才能分页

  1. [聚合查询]

    

        //查user总数var num = db.SysUsers.Count();//查最小IDvar minId = db.SysUsers.Min(u => u.ID);

    NOTE 聚合查询只能通过函数式查询

  1. [连接查询]

   

   var users =from urin db. SysUserRolesjoin uin db. SysUserson ur.SysUserIDequals u.IDselect ur;

NOTE

大家注意,连接查询返回的结果还是一个类型为SysUserRoles的集合,只是用了内连接进行了的筛选。

那么问题来了,如果我需要选择一个集合,里面包括多张表,如SysUser里面的UserName和SysRole里面的RoleName怎么办?

这个是通过navigation property来实现的, 前面新建model的时候提到过,例如SysUser里面的

publicvirtualICollection<SysUserRole> SysUserRoles {get;set; }

但这种做法还是不是太灵活,具体做法我们在下面的详细步骤里面讲。

EF数据更新

UPDATE步骤比较清晰,直接看下面代码。


//数据更新,分三步:找到对象--> 更新对象数据--> 保存更改public ActionResult EFUpdateDemo(){//1.找到对象var sysUser = db.SysUsers.FirstOrDefault(u => u.UserName =="Tom");//2.更新对象数据if (sysUser !=null){sysUser.UserName ="Tom2";}//3.保存修改db.SaveChanges();return View();}


EF数据添加/删除

与UPDATE类似。

//数据添加和删除publicActionResult EFAddOrDeleteDemo(){//添加//1.创建新的实体var newSysUser =newSysUser(){UserName ="Scott",Password ="tiger",Email ="Scott@sohu.com"};//2.增加db.SysUsers.Add(newSysUser);//3.保存修改db.SaveChanges();//删除//1.找到需要删除的对象var delSysUser = db.SysUsers.FirstOrDefault(u => u.UserName =="Scott");//2.删除if (delSysUser!=null){db.SysUsers.Remove(delSysUser);}//3.保存修改db.SaveChanges();return View("EFQueryDemo");}



详细步骤


  • 查询用户及相应角色的功能
  • 修改用户
  • 增加用户和删除用户

查询用户及相应的角色

  1. 在Controller中修改Index方法,添加相关View, 显示所有用户
    1. 将model作为参数传过去

    2. Viewsà Accountà Index.cshtml 顶部添加强类型声明,

      @modelIEnumerable<MVCDemo.Models.SysUser>

      body中添加个table用来显示数据

      NOTE

      @Html.ActionLink("Details","Details",new { id = item.ID })生成一个相同controller下的路由地址。

      显示结果

       

  2. 增加一个Details方法,添加相关View, 显示相应用户及对应的角色
    1. 将特定的model传过去

       

    2. Viewsà Accountà Index.cshtml 顶部添加强类型声明

      @modelMVCDemo.Models.SysUser

      显示数据,注意方框部分如何导航到另外一张表的信息中。

      显示结果

       

更新用户,增加用户,删除用户

这三个操作都类似,属于更新的范畴,我们放在一起来讲。

  1. 修改Viewsà Accountà Index.cshtml

    开头增加Create链接。

    table每条记录后面增加Edit,Delete链接。

     

  2. 在Controller中增加相应的方法。

    新建用户:

//新建用户public ActionResult Create(){return View();}[HttpPost]public ActionResult Create(SysUser sysUser){db.SysUsers.Add(sysUser);db.SaveChanges();return RedirectToAction("Index");}


修改用户:

//修改用户public ActionResult Edit(int id){SysUser sysUser = db.SysUsers.Find(id);return View(sysUser);}[HttpPost]public ActionResult Edit(SysUser sysUser){db.Entry(sysUser).State =EntityState.Modified;db.SaveChanges();return RedirectToAction("Index");}


删除用户:

//删除用户public ActionResult Delete(int id){SysUser sysUser = db.SysUsers.Find(id);return View(sysUser);}[HttpPost,ActionName("Delete")]public ActionResult DeleteConfirmed(int id){SysUser sysUser = db.SysUsers.Find(id);db.SysUsers.Remove(sysUser);db.SaveChanges();return RedirectToAction("Index");}


NOTE

涉及到数据更新的地方都有两个同名的方法重载,一个用来显示[HttpGet],一个用来数据更新[HttpPost]

  1. 在右键方法名,生成相应的View

    每个View的顶部需要添加一个声明

    @modelMVCDemo.Models.SysUser

    各个view的body中具体代码:

    Create.cshtm

<body><div><h2>Create</h2>@using (Html.BeginForm()){<div>@Html.LabelFor(model => model.UserName)@Html.EditorFor(model => model.UserName)</div><div>@Html.LabelFor(model => model.Email)@Html.EditorFor(model => model.Email)</div><div>@Html.LabelFor(model => model.Password)@Html.PasswordFor(model => model.Password)</div><div><inputtype ="submit" value="Create" /></div>}<div>@Html.ActionLink("Back to List", "Index")</div></div>
</body>



Edit.cshtml

<body><div><h2>Edit</h2>@using (Html.BeginForm()){@Html.HiddenFor(model => model.ID)<div>@Html.LabelFor(model => model.UserName)@Html.EditorFor(model => model.UserName)</div><div>@Html.LabelFor(model => model.Email)@Html.EditorFor(model => model.Email)</div><div>@Html.LabelFor(model => model.Password)@Html.PasswordFor(model => model.Password)</div><div><inputtype ="submit" value="Save" /></div>}<div>@Html.ActionLink("Back to List", "Index")</div></div></body>


Delete.cshtml

<body><div><h2>Delete</h2><h3>Are you sure you want to delete this?</h3><h4>User</h4><dl><dt>@Html.DisplayNameFor(model => model.UserName)</dt><dd>@Html.DisplayFor(model => model.UserName)</dd><dt>@Html.DisplayNameFor(model => model.Email)</dt><dd>@Html.DisplayFor(model => model.Email)</dd></dl>@using (Html.BeginForm()){<div><inputtype ="submit" value="Delete" /></div>}<div>@Html.ActionLink("Back to List", "Index")</div></div></body>


NOTE

针对上面这些代码,我们提一下其中用到的HtmlHelper, 主要有这么几个:

DisplayNameFor (model=>model.xxx)à 生成纯文本,显示xxx列名

DisplayFor (model=>model.xxx)à 生成纯文本,显示xxx列的内容

LableFor à 生成一个Lable标签

EditorFor à 生成一个text类型的input

PasswordFor à 类似于EditorFor, 隐藏文本内容

ActionLink à 生成一个<a>标签

BeginForm à 生成一个表单

NOTE

HtmlHelper是可以通过View的Html属性调用的方法(@Html.xxx), 可以类比成原来WebForm的服务器端控件, 后续文章会将分成几类, 归类进行介绍,这里先简单提一下做个铺垫。这块最好的学习方法是用浏览器打开相应的页面,View page source,查看生成的相应HTML代码。


Repository Pattern


最好再补充下Repository Pattern,为下篇文章重构代码做个铺垫。

Repository Pattern是一种设计模式,这个概念大家肯定经常听到。

"企业架构模式" 上的定义:

Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.

具体的做法:

先定义Interface, 通过定义接口确定数据访问类的功能需求, 接着实现该接口。

以对SysUser这张表的操作为例。

先建一个文件夹 Repositories, 在文件夹中新建一个接口IsysUserRepository

我们预先定义几个功能。

namespace MVCDemo.Repositories{public interfaceISysUserRepository{//查询所有用户IQueryable<SysUser> SelectAll();//通过用户名查询用户SysUser SelectByName(string userName);//添加用户void Add(SysUser sysUser);//删除用户bool Delete(int id);}
}


同样文件夹下新建类,继承接口,实现功能。

namespace MVCDemo.Repositories{public classSysUserRepository : ISysUserRepository{protected AccountContext db =new AccountContext();//查询所有用户public IQueryable<SysUser> SelectAll(){return db.SysUsers;}//通过用户名查询用户public SysUser SelectByName(string userName){return db.SysUsers.FirstOrDefault(u => u.UserName == userName);}//添加用户public void Add(SysUser sysUser){db.SysUsers.Add(sysUser);db.SaveChanges();}//删除用户public bool Delete(int id){var delSysUser=db.SysUsers.FirstOrDefault(u => u.ID == id);if (delSysUser !=null){db.SysUsers.Remove(delSysUser);db.SaveChanges();returntrue;}else{returnfalse;}}}}


通过IsysUserRepository接口对象引用SysUserRepository类的实例来调用:

ISysUserRepository ur=new SysUserRepository();var user=ur.xxx; 

怎么样,平时听到的Repository Pattern实现起来就这么简单。

楼主提示 设计模式都来源于编程实践,只要掌握其中几个重要原则,GOF总结的设计模式都能自己推导出来,就类似于几何中的公理和定理的关系。大家工作中做个有心人,多思考,多总结。

 


总结


OK,到此为止,我们对常用的CRUD做了介绍。View, Controller之间都是通过传递Model来交互的。特别要提下下面这张图,通过navigation property实现SysUserà SysUserRoleà SysRole 多表间查询。

当然,这种做法还是有局限性的,后续文章中我们会介绍如何实现类似于之前SQL查询多个表,将多个表的查询结果,例如datatable直接传到view中来显示数据。

好了,今天就到这里。


http://chatgpt.dhexx.cn/article/AfnRVu16.shtml

相关文章

ASP.NET MVC 5 - 入门

注︰本教程的更新的版本是可用在这里使用视觉工作室 2015年。新的教程使用ASP.NET MVC 6 核心&#xff0c;其中在本教程中提供了许多改进。 本教程将教你基本的构建 ASP.NET MVC 5 web 应用程序使用Visual Studio 2013. 下载已完成项目. 本教程由斯科特 格思里(twitterscottgu…

05 MVC 模式

MVC 模式 一、概述 MVC 模式&#xff08;Model–view–controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&…

MVC5 + EF6 入门完整教程二

从前端的UI开始 MVC分离的比较好&#xff0c;开发顺序没有特别要求&#xff0c;先开发哪一部分都可以&#xff0c;这次我们主要讲解前端UI的部分。 ASP.NET MVC抛弃了WebForm的一些特有的习惯&#xff0c;例如服务器端控件&#xff0c;ViewState这些东西&#xff0c;让Web回…

ASP.NET + MVC5 入门完整教程七 -—-- MVC基本工具(上)

这里主要介绍三类工具之一的 依赖项注入&#xff08;DI&#xff09;容器&#xff0c;其他两类 单元测试框架和模仿工具以后介绍。 1、准备示例项目 从创建一个简单的示例开始&#xff0c;名称为"EssentialTools" ,使用MVC空模板&#xff0c;如下所示&#xff1a; 创…

ASP.NET MVC 5 开发框架简介

1、新建项目 2、选择MVC模板 3、MVC框架简介 &#xff08;1&#xff09;App_Data: 该文件夹主要是包含应用程序的本地存储, 它通常以文件形式(如Microsoft SQL Server数据库文件, XML文件等)包含数据存储。 &#xff08;2&#xff09;App_Start: 该文件夹包含应用程序的配置逻…

asp.net mvc5 安装

原文地址 http://docs.nuget.org/docs/start-here/using-the-package-manager-console 工具-->NuGet程序包管理器-->程序包管理器控制台 然后 PM>Install-Package Microsoft.AspNet.Mvc -Version 5.0.0 Finding a Package From the Tools menu, select Library Pa…

MVC5 + EF6 入门完整教程

第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比&#xff0c;增加了很多"约定"。 直接讲这些 "约定" 会让人困惑&#xff0c;而且东西太多容易忘记。 和微软官方教程不同&#xff0c;笔者尽量不用脚手架&#xff0c;从空白框架开始&…

ASP.NET + MVC5 入门完整教程二

从前端UI开始 MVC分离的比较好&#xff0c;开发顺序没有特别要求&#xff0c;先开发哪一部分都可以&#xff0c;这次我们主要讲解前端UI的部分。而谈到一个Web Application的UI&#xff0c;涉及到的无非就是html、css、 js这些东西。有兴趣的同学可以看看EsayUI。 任务 建立 注…

asp.net + MVC5 入门完整教程一

第1课 从0开始 从空白框架开始&#xff0c;一步一步添加功能&#xff0c;让大家能真正能用起来&#xff0c;理解每一个过程。 概述 本系列文章及文章中的例子主要基于微软官方文档 使用工具 : VS2014 sqlServer 2014 开始主要讲解MVC使用&#xff0c;后续同样也会提供MVC A…

ASP.NET + MVC5 入门完整教程三 (上) ---第一个MVC项目

第一个MVC应用程序 1创建MVC项目 打开VS &#xff0c;File--新建--项目&#xff0c;选择ASP Web项目&#xff0c;命名后确认。选择&#xff08;Empty&#xff09;空模板&#xff0c; 项目创建完成&#xff0c;会看到 解决方案管理器 窗口显示一些文件夹&#xff0c;如图&…

ASP.net MVC5 简介

ASP.net MVC5 简介 MVC是什么 MVC是一种设计模式。 也就是Model-View-Controller 模型-视图-控制器。 Model的功能 Model试数据模型&#xff0c;用来封装与程序相关的数据&#xff0c;以及对数据操作的处理方法。 有关“数据处理”的范围都可以属于Model&#xff0c;比如…

ASP.NET MVC5 网站开发实践 - 概述

前段时间一直在用MVC4写个网站开发的demo&#xff0c;由于刚开始学所有的代码都写在一个项目中&#xff0c;越写越混乱&#xff0c;到后来有些代码自己都理不清了。1月26日晚上在群里跟怒放 他们讨论这个问题&#xff0c;结论是即使只是一个小demo也应该分层来写。正好看到别人…

MVC5路由系统机制详细讲解

转自&#xff1a;http://www.lanhusoft.com/Article/213.html 请求一个ASP.NET mvc的网站和以前的web form是有区别的&#xff0c;ASP.NET MVC框架内部给我们提供了路由机制&#xff0c;当IIS接受到一个请求时&#xff0c;会先看是否请求了一个静态资源&#xff08;.html,css,…

基于用户 的协同过滤算法

计算用户相似度和用户对未知物品的可能评分 基于用户的协同过滤算法主要包括两个步骤。 (1) 找到和目标用户兴趣相似的用户集合。 (2) 找到这个集合中的用户喜欢的&#xff0c;且目标用户没有听说过的物品推荐给目标用户。 例如现在有A、B、C、D四个用户&#xff0c;分别对a、…

JAVA开源协同过滤算法,推荐算法:协同过滤算法的介绍

一、什么是推荐算法 互联网的出现和普及给用户带来了大量的信息&#xff0c;满足了用户在信息时代对信息的需求&#xff0c;但随着网络的迅速发展而 带来的网上信息量的大幅增长&#xff0c;使得用户在面对大量信息时无法从中获得对自己真正有用的那部分信息&#xff0c;对信息…

协同过滤算法实验

本次呢&#xff0c;简单介绍一下协同过滤算法&#xff0c;并且给出简单的电影推荐实验作为举例说明。利用Spark MLlib中的协同过滤算法完成针对特定用户的电影推荐功能。这一部分需要实现实现输入用户id&#xff0c;输出为其推荐的电影。 一、协同过滤 所谓协同过滤&#xff0…

协同过滤算法及python实现

协同过滤算法及python实现 1.算法简介 协同过滤算法是一种较为著名和常用的推荐算法&#xff0c;它基于对用户历史行为数据的挖掘发现用户的喜好偏向&#xff0c;并预测用户可能喜好的产品进行推荐。也就是常见的“猜你喜欢”&#xff0c;和“购买了该商品的人也喜欢”等功能。…

协同过滤算法理论

1. 协同过滤算法 协同过滤&#xff08;Collaborative Filtering&#xff09;推荐算法是最经典、最常用的推荐算法。 所谓协同过滤&#xff0c;基本思想是根据用户之前的喜好以及其他兴趣相近的用户的选择来给用户推荐物品(基于对用户历史行为数据的挖掘发现用户的喜好偏向&…

协同过滤算法实战

简介 公司给了一个任务&#xff0c;要求根据相似度匹配给教师推荐课程。正好复(预)习一下协同过滤算法。直接探索一下协同过滤应用。 目前教师档案大数据系统中存有海量的教师数据&#xff0c;这些数据对于教师的未来决策&#xff0c;预测教师发展路径&#xff0c;推荐教师课…

协同过滤算法(例题理解)

协同过滤算法是一种推荐系统算法&#xff0c;它利用用户对物品的评价数据来预测用户对未评价物品的喜好程度。该算法基于一个简单的思想&#xff1a;如果两个用户在过去对某些物品的评价很相似&#xff0c;那么在未来他们对这些物品的评价也很可能相似。因此&#xff0c;协同过…