你的位置:首页 > ASP.net教程

[ASP.net教程]MVC5+EF6简单实例


 


 



工具:VS.net2013、EF6、MVC5、SQLServer2008

参考出处:

http://www.cnblogs.com/slark/p/mvc-5-get-started-create-project.html

http://www.cnblogs.com/miro/p/4288184.html

http://www.cnblogs.com/dotnetmvc/p/3732029.html

 一、准备工作

在SqlServer上创建数据库:Element

模拟两个表并插入数据:SysUser(用户表)、SysRole(角色表)

CREATE TABLE [dbo].[SysUser](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [Name] [nchar](10) NOT NULL,
 [RoleNum] [nchar](10) NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[SysRole](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [RoleName] [nchar](10) NOT NULL,
 [RoleNum] [nchar](10) NOT NULL
) ON [PRIMARY]

插入数据:

二、新建MVC项目

 
生成的解决方案的文件夹,对MVC的理解尚浅,不作过多的讲解,请多看看各位大侠们的博文,能受益匪浅。要真正理解框架的涵义,分层的优点,多动手,多感受,多思考。通过这几天的学习,感觉EF(Entity FrameWork)如它名字一样,是与Model层相关的,可生成实体对象。与Controll、View应该没直接联系,一开始容易和其它层混在一块,要分清概念和作用。(如理解不对乐意接受批评指正!)

安装EF6:

 

二、使用EF的Code First从原有数据库中生成Models

在Models文件夹上右键--添加--新建项

 
数据--ADO.NET实体数据模型

 
 如不能出现下图的选项,请下载安装Entity Framework 6.1.0 Tools for Visual Studio 2012 & 2013下载地址:http://www.cnblogs.com/dotnetmvc/p/3644980.html

 选择新建连接

 
 

 点击更改,选择如下图

 

 

 
 选择我们需要生成数据模型的两个表

 
 完成后在Models文件夹下生成如下三个文件  其中ElementModel.cs为数据库连接上下文,也就是连接数据库用的,SysUser.cs和SysRole.cs为对应数据库表的数据实体模型。
 

 三、根据Model生成Controller及View

 在Controllers文件夹上右键--添加--控制器


 
 输入控制器名称、选择模型类、数据库上下文(以SysUser模型为例)
 
 
 完成后在Controllers文件夹下生成SysUserController.cs,SysUserController的作用就是接收View层的action(动作),然后到相应的model层进行的数据交互,再把结果返回给View。
同样,在Views文件夹下也生成了SysUser文件夹,里面对应着五个视图页面的CShtml文件。右键Index.cshtml--在浏览器中查看,显示如下页面:
 
 

四、利用ViewModel显示多表联合查询

 刚刚我们通过controller把从一个表SysUser中查询的数据以SysUser(Model)实体的形式返回给Index(View)显示,而在实际工作中我们需要联合查询多个表中的数据并在View中显示。那个我们就需要借助于ViewModel,ViewModel是更接近于View的实体模型,也就是我们根据View中所要显示的数据的需要来建立实体模型。而Model更接近于数据库实体。下面我们就实现一个简单的两表联合查询的小例子:查询出SysUser表中的用户名及它所对应的角色名。
 
右键解决方案--添加--新建文件夹(ViewModel),然后右键ViewModel文件夹--添加--类
 
 
新建UserRole类,并添加实体如下:

namespace MVCDemo.ViewModels
{
    public class UserRole
    {
        public string userName { get; set; }
        public string userRole { get; set; }
    }
}

右键Controllers文件夹添加控制类,此类继承于Controller类


添加代码如下(用Linq to Entity两表联合查询):

using System;

using System.Collections.Generic;

using System.Linq; using System.Web;

using System.Web.Mvc; using System.Data.Entity;

using MVCDemo.ViewModels;

using MVCDemo.Models;

namespace MVCDemo.Controllers

{    

  public class UserRoleController : Controller    

  {        

    ElementModel db = new ElementModel();

          public ActionResult Index()        

    {            

      var userRoleList = from uu in db.SysUsers                               

        join ud in db.SysRoles on uu.RoleNum equals ud.RoleNum                               

        where uu.ID == 1                               

        select new UserRole {userName = uu.Name,userRole = ud.RoleName}            

      return View(userRoleList);        

    }    

  }

}


 右键Views文件夹,新建UserRole文件夹;右键UserRole文件夹,添加--带有布局的MVC5视图页Index.cshtml,添加代码如下:

@model IEnumerable<MVCDemo.ViewModels.UserRole>

@{    

  Layout = "~/Views/Shared/_Layout.cshtml";

  }

<table >    

<tr>        

   <th>            

    @Html.DisplayNameFor(model=>model.userName)

        </th>

        <th>

            @Html.DisplayNameFor(model => model.userRole)

        </th>

        <th></th>

    </tr>

      @foreach (var item in Model)

    {       

  <tr>          

   <td>                

@Html.DisplayFor(modelItem => item.userName)

            </td>           

     <td>

                @Html.DisplayFor(modelItem => item.userRole)

            </td>  

       </tr>    

}

</table>