目录
MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型
MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理
MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案
上一章介绍了,如何建数据层和业务,以及各层之间的引用过关系
这章主要讲解怎么使用业务层的方法。
以及普遍遇到的EF关联查询的问题解决方案
1、在FytMsys.Web文件夹下建FytMsys.Web应用程序,选择MVC MVCAPI 单元测试
在FytMsys.Web建一个帮助类库(目前主要实例化业务层也EF上下文的方法)
FytMsys.Web引用Domain.Entity、BusinessLogic.Server
建好后,如图:
在FytMsys.Helper类库下增加类OperateContext
并添加引用关系Domain.Entity、BusinessLogic.Server
并通过NuGet添加EF
类里面的代码如下:
/// <summary> /// 公用类实例化业务对象 /// </summary> public class OperateContext<T> where T : class,new() { public static BaseServer<T> SetServer = new BaseServer<T>(); } /// <summary> /// 公共实例化数据仓储 /// </summary> public class OperateSession { public static FytSysDbContext SetContext = new FytSysDbContext(); }
在FytMsys.Web应用程序下的Controllers文件夹下HomeController做测试操作
增加代码
//获得一个Admin的实体对象,根据ID=2 public ActionResult GetModels() { var model = OperateContext<Domain.Entity.tb_Admin>.SetServer.GetModel(2); return View(); }
通过这个就可以获得一个对象,并通过Admin的对象,可以查询角色表中的角色名称
表之间的关系:admin表中有,部门表ID ,角色表ID
/*==================================================*/
/*==================================================*/
如果控制器返回Json,EF就会报错,因为表的关系是相互的,在序列化的时候,就造成了死循环,所以Json(model)会抛出异常
/*==================================================*/
/*==================================================*/
2种 解决方法
第一:通过DTO重写用户表,部门表,角色实体
第二:聚合设计(暂不考虑)
第一种方法,太过麻烦,还在在模型类库中建3个类,如果有100个表,50个关系,建起来把骚年也累趴蛋了
通过和大神(台湾的)沟通,他给出的方法是通过Json.Net方式来做或者通过Linq
方案有了,那开整,解决代码如下:
//获得一个Admin的实体对象,根据ID=2 public ActionResult GetModels() { //var model = OperateContext<Domain.Entity.tb_Admin>.SetServer.GetModel(2); var m = OperateSession.SetContext.tb_Admin.Select(c => new { RoName = c.tb_AdminRole.roleName, c.RealName, c.LoginName }); return Json(m, JsonRequestBehavior.AllowGet); }
这次调用的是OperateSession.SetContext EF上下直接通过Linq查询实体,返回一个新的模型,这样Json可以满足基本条件了
框架搭好,下一步就是UI设计和前台代码编写了
待续........................
讨论群:86594082 欢迎渣渣和屌丝的加入(尤其是女女)