zoukankan      html  css  js  c++  java
  • MVC+EF6教程二:EF基本的CRUD

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

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

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

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

    文章提纲

    概述 & 要点

    理论基础

    详细步骤

    总结

    概述 & 要点

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

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

    EF数据查询

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

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

    假设我们已经定义好了context

    private AccountContext db = new AccountContext();

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

    var users = from u in db.SysUsers

    select u; //表达式方式

    users = db.SysUsers; //函数式方式

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

    users = from u in db.SysUsers

    where u.UserName == "Tom"

    select u; //表达式方式

    users = db.SysUsers.Where(u => u.UserName == "Tom"); //函数式方式

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

    3.[排序和分页查询]

    users = (from u in db.SysUsers

    orderby u.UserName

    select u).Skip(0).Take(5); //表达式方式

    users = db.SysUsers.OrderBy(u => u.UserName).Skip(0).Take(5); //函数式方式

    NOTE 只有排序了才能分页

    4.[聚合查询]

    //查user总数

    var num = db.SysUsers.Count();

    //查最小ID

    minId = db.SysUsers.Min(u => u.ID);

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

    5.[连接查询]

    var users = from ur in db. SysUserRoles

    join u in db. SysUsers

    on ur.SysUserID equals u.ID

    select ur;

    详细步骤

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

    使用Repository Pattern模式,完成对数据库表的CRUD操作。具体的做法:

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

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

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

        public interface ISysUserRepository
        {
            // 查询所有用户
            IQueryable<SysUser> SelectAll();
            // 根据用户名称查询用户
            SysUser SelectByName(string userName);
            // 根据用户ID查询用户
            SysUser SelectByID(int id);
            // 添加用户
            void Add(SysUser user);
            // 根据用户ID删除用户
            bool Delete(int id);
        }

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

      public class SysUserRepository : ISysUserRepository
        {
            protected AccountContext db = new AccountContext();
            /// <summary>
            /// 添加用户
            /// </summary>
            /// <param name="user"></param>
            public void Add(SysUser user)
            {
                db.SysUsers.Add(user);
                db.SaveChanges();
            }
            /// <summary>
            /// 删除用户
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            public bool Delete(int id)
            {
                SysUser user = db.SysUsers.Find(id);
                if (user != null)
                {
                    db.SysUsers.Remove(user);
                    db.SaveChanges();
                    return true;
                }
                else
                {
                    return false;
                }
            }
            /// <summary>
            /// 查询所有用户
            /// </summary>
            /// <returns></returns>
            public IQueryable<SysUser> SelectAll()
            {
                return db.SysUsers;
            }
            /// <summary>
            /// 根据用户名查询用户
            /// </summary>
            /// <param name="userName">用户名称</param>
            /// <returns></returns>
            public SysUser SelectByName(string userName)
            {
                SysUser user = db.SysUsers.FirstOrDefault(u => u.UserName == userName);
                return user;
            }
            /// <summary>
            /// 根据用户ID查询用户
            /// </summary>
            /// <param name="id">用户ID</param>
            /// <returns></returns>
            public SysUser SelectByID(int id)
            {
                SysUser user = db.SysUsers.FirstOrDefault(u => u.ID == id);
                return user;
            }
        }

    1.查询用户及相应的角色

    将所有用户作为参数传给View

    public ActionResult Index()
    {
    // 将model作为参数传过去 return View(db.SysUsers); }
    增加一个Details方法,添加相关View, 显示相应用户及对应的角色
    public ActionResult Details(int id)
    {
      SysUser user = db.SysUsers.Find(id);
      return View(user);
    }

    通过IsysUserRepository接口对象引用SysUserRepository类的实例来调用:ISysUserRepository repository = new SysUserRepository();

    增加用户、更新用户和删除用户的Control代码如下(涉及到数据更新的地方都有两个同名的方法重载,一个用来显示[HttpGet],一个用来数据更新[HttpPost])

    public ActionResult Create()
    {
      return View();
    }
    [HttpPost]
    public ActionResult Create(SysUser user)
    {
      repository.Add(user);
      return RedirectToAction("Index");
    }
    public ActionResult Edit(int id)
    {
      SysUser user = repository.SelectByID(id);
      return View(user);
    }
    [HttpPost]
    public ActionResult Edit(SysUser user)
    {
      db.Entry(user).State = System.Data.Entity.EntityState.Modified;
      db.SaveChanges();
      return RedirectToAction("Index");
    }
    public ActionResult Delete(int id)
    {
      SysUser user = repository.SelectByID(id);
      return View(user);
    }
    [HttpPost, ActionName("Delete")]
    public ActionResult DeleteConfirmed(int id)
    {
      bool flag = repository.Delete(id);
      return RedirectToAction("Index");
    }

    用户详情View(Details.cshtml)

    <body>
        @model MvcWebDemo.Models.SysUser
        <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>
            <dt>
                @Html.DisplayNameFor(model=>model.SysUserRoles)
            </dt>
            <dd>
                <table>
                    <tr>
                        <th>RoleName</th>
                        <th>RoleDesc</th>
                    </tr>
                    @foreach (var item in Model.SysUserRoles)
                    {
                <tr>
                    <td>@Html.DisplayFor(modelItem=>item.SysRole.RoleName)</td>
                    <td>@Html.DisplayFor(modelItem => item.SysRole.RoleDesc)</td>
                </tr>
                        
                    }
                </table>
            </dd>
        </dl>
    </body>

    增加用户View(Create.cshtml)

    <body>
        @model MvcWebDemo.Models.SysUser
            <div>
                @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>
                        <input type="submit" value="Create" />
                    </div>
                }
                <div>@Html.ActionLink("Back to List", "Index")</div>
            </div>
    
        </body>

    更新用户View(Edit.cshtml)

        <body>
            @model MvcWebDemo.Models.SysUser
            <div>
                <h2>Edit</h2>
                @*BeginForm  生成一个表单*@
                @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>
                        <input type="submit" value="Save" />
                    </div>
                }
                <div>@Html.ActionLink("Back to List", "Index")</div>
            </div>
        </body>

    删除用户View(Delete.cshtml)

    <body>
            @model MvcWebDemo.Models.SysUser
            <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>
                        <input type="submit" value="Delete" />
                    </div>
                }
                <div>
                    @Html.ActionLink("Back to List", "Index")
                </div>
            </div>
        </body>
    Views/Account/Index.cshtml 顶部添加强类型声明,

    @model IEnumerable<MvcWebDemo.Models.SysUser>

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

    <body>
        @model IEnumerable<MvcWebDemo.Models.SysUser>
        <div>
            <p>
                @*ActionLink 生成一个<a>标签*@
                @Html.ActionLink("Create SysUser", "Create")
            </p>
            <table>
                <tr>
                    <th width="100px">@Html.DisplayNameFor(model => model.UserName)</th>
                    <th width="150px">@Html.DisplayNameFor(model => model.Email)</th>
                    <th width="350px">操作</th>
                </tr>
                @foreach (var item in Model)
                {
                    <tr>
                        <td>@Html.DisplayFor(modelItem => item.UserName)</td>
                        <td>@Html.DisplayFor(modelItem => item.Email)</td>
                        <td>
                            @Html.ActionLink("SysUser Details", "Details", new { id = item.ID })
                              
                            @Html.ActionLink("SysUser Edit", "Edit", new { id = item.ID })
                              
                            @Html.ActionLink("SysUser Delete", "Delete", new { id = item.ID })
                        </td>
                    </tr>
                }
            </table>
        </div>
    </body>

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

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

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

    LableFor   生成一个Lable标签

    EditorFor   生成一个text类型的input

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

    ActionLink   生成一个<a>标签

    BeginForm  生成一个表单

    显示结果:

    总结

    到此为止,我们对常用的CRUD做了介绍。View, Controller之间都是通过传递Model来交互的。

    权责申明

    作者:编程小纸条 出处: https://www.cnblogs.com/miro/category/620362.html

  • 相关阅读:
    hdu 4739 Zhuge Liang's Mines DFS
    Uva 12304
    三角形的心
    最小路径覆盖的理解
    Codeforces Round #192 (Div. 2)
    Uva 11796 Dog Distance
    laravel框架session使用教程
    php session跨页面传递 session值丢失问题
    PHP 5.4中的traits特性
    PHP5.3 goto操作符介绍
  • 原文地址:https://www.cnblogs.com/qianj/p/12497741.html
Copyright © 2011-2022 走看看