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

posted @ 2020-03-15 15:16  云淡风轻~江哥  阅读(268)  评论(0编辑  收藏  举报