EF数据

应用场景

场景一:多对一关系,显示用户及相应的部门(* to 0 or 1)

新建一个entity: SysDepartment

我们约定,某个用户只能归属于0个或1个部门。

即用户和部门的关系为(* to 0 or 1)

原来的SysUser中添加一个如下两个property

使用 code first migrations的方式更新下数据库。可以看到新的表结构已经生成了。

去数据库中SysDepartment添加两笔资料。

去数据库中SysUser修改用户对应的department

先看下原来的Views\Account\Index.cshtml

我们原来是显示SysUser主表内容,当点击Details时通过navigation property实现SysUseràSysUserRoleàSysRole多表间查询。

现在我们增加一列Department, 让这个表格能直接显示SysUser主表及相应的Department内容。

我们使用Eager Loading的方式将Department的内容也加载进去,打开Controllers\AccountController.cs, 在index修改一处地方:

修改对应的View

运行,可以看到Department中的内容已经被我们加载进来了。

这个就是第一种场景,多对一的情况。

下面我们再来看多对多的情况。

场景二:多对多关系

多对多关系可以拆解成一对多的关系,例如用户和角色(* to *)可拆解成:

显示用户及相应的角色(1 to *)

显示角色及相应的用户(1 to *)

为了演示这个场景,我们新建一个ViewModel,将需要显示的表都放进去。

创建相应的Controller和View

因为前面的文章已经将基本的用法都讲过了,我这里就直接贴出代码以及最终的展示结果,如果有不理解的部分再给我留言。

Controllers\UserRoleController.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;

using MVCDemo.ViewModels;

using MVCDemo.DAL;

using MVCDemo.Models;

using System.Data.Entity;

 

 

namespace MVCDemo.Controllers

{

public class UserRoleController : Controller

{

private AccountContext db = new AccountContext();

//

// GET: /UserRole/

public ActionResult Index(int? id)

{

var viewModel = new UserRoleIndexData();

viewModel.SysUsers = db.SysUsers

.Include(u=>u.SysDepartment)

.Include(u => u.SysUserRoles.Select(ur => ur.SysRole))

.OrderBy(u => u.UserName);

 

if (id!=null)

{

ViewBag.UserID = id.Value;

viewModel.SysUserRoles = viewModel.SysUsers.Where(u => u.ID == id.Value).Single().SysUserRoles;

viewModel.SysRoles = (viewModel.SysUserRoles.Where(

ur => ur.SysUserID == id.Value)).Select(ur=>ur.SysRole);

 

}

return View(viewModel);

}

    }

}

 

Views\UserRole\Index.cshtml

@model MVCDemo.ViewModels.UserRoleIndexData

 

@{

ViewBag.Title = "Index";

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

}

 

<h2>UserRoles</h2>

 

<p>

@Html.ActionLink("Create New""Create")

</p>

 

<table class="table table-striped">

<tr>

<th>

UserName

</th>

<th>

Email

</th>

<th>

CreateDate

</th>

<th>

Department

</th>

<th>

Roles

</th>

<th></th>

</tr>

@foreach (var item in Model.SysUsers)

{

string selectedRow = "";

if (item.ID==ViewBag.UserID)

{

selectedRow = "success";

}

<tr class="@selectedRow">

<td>

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

</td>

<td>

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

</td>

<td>

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

</td>

<td>

@if (item.SysDepartment != null)

{

@item.SysDepartment.DepartmentName

}

</td>

<td>

@{

foreach (var userRole in item.SysUserRoles)

{

@userRole.SysRole.RoleName <br />

}

}

</td>

<td>

@Html.ActionLink("Select""Index"new { id = item.ID })

 

</td>

</tr>

}

</table>

 

@if (Model.SysRoles != null)

{

<h3>Related Roles</h3>

<table class="table table-striped">

<tr>

<th>RoleName</th>

<th>RoleDesc</th>

</tr>

 

@foreach (var item in Model.SysRoles)

{

<tr>

<td>

@item.RoleName

</td>

<td>

@item.RoleDesc

</td>

</tr>

}

</table>

}

 

 

最终展示结果:

总结

一、掌握常用attribute

DataType

例子:[DataType(DataType.Date)]

DisplayFormat

例子:

[DisplayFormat(DataFormatString="{0:yyyy-MM-dd}",ApplyFormatInEditMode=true)]

[DisplayFormat(NullDisplayText = "No grade")]

StringLength

例子:

[StringLength(10,MinimumLength=1,ErrorMessage="名字在1和10个字之间")]

Column

例子:

[Column("FirstName")]

[Column(TypeName="money")]

Display

例子:

[Display(Name="用户名")]

 

二、掌握加载多表数据两种应用场景

 

好了,到目前为止,使用MVC+EF开发的基本知识差不多都齐全了。

在下一课,也就是我们第一阶段的最后一课:MVC5+EF6入门完整教程十,我们将再讲解下数据更新的部分,以及如何使用原生SQL,如何调用存储过程等。


  



标签:  EFMVC
2
0
(请您对文章做出评价)
« 上一篇: MVC5+EF6 入门完整教程八
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值