ASP.NET MVC5+EF6搭建三层实例

一、创建项目解决方案

1.model层、BLL层、Dal层、Common层,都是类库

2.UI层使用MVC5

二、使用EF链接数据库

1.创建实体数据模型

2.选择来自数据库EF设计器

3.创建数据库链接

4.选是,点击下一步,选择实体框架6.x,下一步选择要创建的表

三、创建Dal层中链接数据库操作并实现查询父类与子类

1.在Dal层创建一个BaseDBContext类,用来自定义EF上下文,首先引用EF框架。备注:Dal层需要应用model层。

BaseDBContext类:

  1 namespace Wchl.EFDal
  2 {
  3     /// <summary>
  4     /// 自定义的EF上下文容器类
  5     /// </summary>
  6     public class BaseDBContext: DbContext
  7     {
  8         /// <summary>
  9         /// 负责根据指定的数据库链接字符串,初始化EF
 10         /// </summary>
 11         public BaseDBContext() : base("name=DonationEntities") { }
 12     }
 13 }

2.创建BaseDal类来存放每个类中共有的方法:查询、新增、编辑、删除、执行Sql语句。

2.1这里先实现一个查询的方法,然后接下来在扩充

BaseDal类:

  1 namespace Wchl.EFDal
  2 {
  3     /// <summary>
  4     /// 负责操作数据库中的所有表的普通增,删,查,改操作的
  5     /// </summary>
  6     /// <typeparam name="TEntity"></typeparam>
  7     public class BaseDal<TEntity> where TEntity:class
  8     {
  9         //1.0实例化EF上下文容器对象
 10         BaseDBContext db = new BaseDBContext();
 11
 12         DbSet<TEntity> _dbset;
 13
 14         public BaseDal()
 15         {
 16             //初始化
 17             _dbset = db.Set<TEntity>();
 18         }
 19
 20         #region 查询
 21         public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
 22         {
 23             return _dbset.Where(where).ToList();
 24         }
 25         #endregion
 26
 27     }
 28 }

2.2创建CompanyDal类和DonationDetailDal来继承BaseDal

CompanyDal类:

  1 namespace Wchl.EFDal
  2 {
  3      public class CompanyDal:BaseDal<Company>
  4     {
  5     }
  6 }

DonationDetailDal类:

  1 namespace Wchl.EFDal
  2 {
  3     public class DonationDetailDal:BaseDal<DonationDetail>
  4     {
  5         //可以各自类的独有的方法
  6     }
  7 }

四、在BLL层来调用Dal层 需要应用model层

4.1创建BaseBLL类做为基类,并且调用dal中查询的方法

  1 namespace Wchl.EFBLL
  2 {
  3     public class BaseBLL<TEntity> where TEntity:class
  4     {
  5         //初始化BaseDal泛型类的对象
  6         BaseDal<TEntity> bdal = new BaseDal<TEntity>();
  7
  8         public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
  9         {
 10             return bdal.Query(where);
 11         }
 12     }
 13 }

4.2创建CompanyBLL类和DonationDetailBLL类来几层父类

DonationDetailBLL类:

  1 namespace Wchl.EFBLL
  2 {
  3     public class DonationDetailBLL:BaseBLL<DonationDetail>
  4     {
  5     }
  6 }

CompanyBLL类:

  1 namespace Wchl.EFBLL
  2 {
  3     public class CompanyBLL:BaseBLL<Company>
  4     {
  5     }
  6 }

五、UI层调用bl层l和model层,在home控制器下创建一个test方法 创建视图Views

5.1 创建Test方法

  1         public ActionResult Test()
  2         {
  3             CompanyBLL cbll = new CompanyBLL();
  4
  5             return View(cbll.Query(c=>true));
  6         }

5.2在创建视图的时候使用布局页,并选择list模板,模型类选择Company (Wchl.EFModel)

5.3 然后在model层中的App.Config文件中把数据库链接,拷贝到UI层Web.config中

5.4运行http://localhost:15725/home/test页面,数据就会显示了

六、完善DAL层中的BaseDal类 实现关联查询、删除、编辑、新增、统一保存的方法

BaseDal类:

  1 namespace Wchl.EFDal
  2 {
  3     /// <summary>
  4     /// 负责操作数据库中的所有表的普通增,删,查,改操作的
  5     /// </summary>
  6     /// <typeparam name="TEntity"></typeparam>
  7     public class BaseDal<TEntity> where TEntity:class
  8     {
  9         //1.0实例化EF上下文容器对象
 10         BaseDBContext db = new BaseDBContext();
 11
 12         DbSet<TEntity> _dbset;
 13
 14         public BaseDal()
 15         {
 16             //初始化
 17             _dbset = db.Set<TEntity>();
 18         }
 19
 20         #region 查询
 21         public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
 22         {
 23             return _dbset.Where(where).ToList();
 24         }
 25
 26         public List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> where,string[] tableNames)
 27         {
 28             //将子类_dbset 赋值给父类的query
 29             DbQuery<TEntity> query = _dbset;
 30
 31             foreach (var item in tableNames)
 32             {
 33                 //遍历要连表的表名称,最终得到所有连表以后的DbQuery对象
 34                 query = query.Include(item);
 35             }
 36             return query.Where(where).ToList();
 37         }
 38         #endregion
 39
 40         #region 新增
 41         public void Add(TEntity model)
 42         {
 43             _dbset.Add(model);
 44         }
 45         #endregion
 46
 47         #region 编辑
 48         public void Edit(TEntity model,string[] propertyName)
 49         {
 50             if (model == null)
 51             {
 52                 throw new Exception("model必须为实体的对象");
 53             }
 54             if (propertyName == null || propertyName.Any() == false)
 55             {
 56                 throw new Exception("必须至少指定一个要修改的属性");
 57             }
 58
 59             //将model追加到EF容器
 60             DbEntityEntry entry = db.Entry(model);
 61
 62             entry.State = EntityState.Unchanged;
 63
 64             foreach (var item in propertyName)
 65             {
 66                 entry.Property(item).IsModified = true;
 67             }
 68         }
 69         #endregion
 70
 71         #region 物理删除
 72         //EntityState.Unchanged
 73         public void Delete(TEntity model, bool isAddedEFContext)
 74         {
 75             if (isAddedEFContext == false)
 76             {
 77                 _dbset.Attach(model);
 78             }
 79             //修改状态为deleted
 80             _dbset.Remove(model);
 81         }
 82         #endregion
 83
 84         #region 统一执行保存
 85         public int SaveChanges()
 86         {
 87             return db.SaveChanges();
 88         }
 89         #endregion
 90
 91     }
 92 }

七、完善BLL层BaseBLL类的方法

BaseBLL类:

  1 namespace Wchl.EFBLL
  2 {
  3     public class BaseBLL<TEntity> where TEntity:class
  4     {
  5         //初始化BaseDal泛型类的对象
  6         BaseDal<TEntity> bdal = new BaseDal<TEntity>();
  7         #region 查询
  8         public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
  9         {
 10             return bdal.Query(where);
 11         }
 12
 13         public List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> where, string[] tableNames)
 14         {
 15             return bdal.QueryJoin(where, tableNames);
 16         }
 17         #endregion
 18
 19         #region  新增
 20
 21         public void Add(TEntity model)
 22         {
 23             bdal.Add(model);
 24         }
 25
 26         #endregion
 27
 28         #region  编辑
 29
 30         /// <summary>
 31         /// 要求:model必须是自己定义的实体,此时没有追加到EF容器中
 32         /// </summary>
 33         /// <param name="model"></param>
 34         public void Edit(TEntity model, string[] propertyName)
 35         {
 36             bdal.Edit(model, propertyName);
 37         }
 38
 39         #endregion
 40
 41         #region  物理删除
 42
 43         /// <summary>
 44         /// model必须是自己定义的,一般是按照主键来删除
 45         /// </summary>
 46         /// <param name="model">要删除的实体对象</param>
 47         /// <param name="isAddedEFContext">true:表示model以及追加到了ef容器,false:未追加</param>
 48         public void Delete(TEntity model, bool isAddedEFContext)
 49         {
 50             bdal.Delete(model, isAddedEFContext);
 51         }
 52
 53         #endregion
 54
 55         #region 统一执行sql语句
 56
 57         public int SaveChanges()
 58         {
 59             return bdal.SaveChanges();
 60         }
 61
 62         #endregion
 63
 64     }
 65 }

八、mvc调用测试

  1   public ActionResult Test()
  2         {
  3             CompanyBLL cbll = new CompanyBLL();
  4
  5             //新增测试:
  6             Company model = new Company()
  7             {
  8                 CName = "测试1111111"
  9             };
 10             cbll.Add(model);
 11
 12             //修改
 13             //Company model1 = new Company()
 14             //{
 15             //    cID = 8,
 16             //    CName = "测试22221"
 17             //};
 18
 19             //cbll.Edit(model1, new string[] { "CName" });
 20
 21
 22             //删除
 23             var model2 = cbll.Query(c => c.cID == 8).FirstOrDefault();
 24             cbll.Delete(model2, true);//执行sql语句 打开关闭了一次ado.net链接
 25
 26             //统一将上面的新增,编辑,删除分别生成insert,update,delete语句一次性发送给数据库执行
 27             cbll.SaveChanges();
 28
 29
 30
 31             return View(cbll.Query(c=>true));
 32         }

时间: 2024-08-26 08:57:51

ASP.NET MVC5+EF6搭建三层实例的相关文章

ASP.NET MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统

文章来源: Slark.NET-博客园http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-grid.html 上一节:ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用 源码下载:点我下载 要做一个完整的系统,除了需要MVC这样的B/S框架及EF这样的数据库访问技术之外,一个简洁.美观.大方的UI框架也是必不可少的. 话不多说,有请今天的主角登场!! 看看它的自我介绍,是不是很屌.没错,这个介绍一点都不夸

用ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统

用http://ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统 背景:前段时间,给一家公司做外包(就是图标是朵菊花那家).为了尽快实现交付,网上四处寻找适合中小型企业框架.花了几天无果,只在github上找了个(貌似作者还要收费),把前端半改造,后端彻底改造(最终版本全部没有使用github的代码).现在,把这段时间的成果最初版本贡献出来.若是有类似需求的同学,尽可拿去用,不清楚的可以留言. 本人认为:除非是定制的软件和定价了的软件可以收费外,开源的都应该免费

构建ASP.NET MVC5+EF6+EasyUI 1.5+Unity4.x注入的后台管理系统(1)-前言与目录(持续更新中...)

前言: 起初写这个框架的时候,可以说在当时来说并不是很流行的设计模式,那是在2012年,面向对象的编程大家都很熟悉, 但是“注入.控制反转(DI,IOC,依赖注入).AOP切面编程”新兴名词 很多人并不知道特别是从事.NET开发的人,至少在当时 是这么样的,但是在今天它们却是非常流行的技术指标,很多大牛也承认,这是主流的开发模式,你们可以从招聘网的技术岗位看出. 我从事过MVC2.0到5.0的相关开发工作,见证了MVC的成熟演变过程,就像本框架一样,设计模式未曾改变,但是代码一直在重 构.我也坚

构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(51)-系统升级

系统很久没有更新内容了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+EF6+Unity4.x+Quartz 2.3 +easyui 1.4.3. 并以easyui 1.4.3的gray皮肤为基础,升级10个扁平化皮肤 皮肤查看地址 更新的主要目的:新的MVC5特性和更好的性能 记录一下升级过程. 1.除了web层,其他全部提取. 2.新建解决方案.以前命名空间为App.现在更名为Apps. 3.

构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2)

前言: 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(65)-MVC WebApi 用户验证 (1) 回顾上一节,我们利用webapi简单的登录并进行了同域访问与跨域访问来获得Token,您可以跳转到上一节下载代码来一起动手. 继续上一篇的文章,我们接下来演示利用拿到的Token来访问接口,管理接口,利用系统权限管理接口,对每个接口进行授权(管理接口为选读部分,因为你需要阅读最开始权限管理部分(18-27节),才能阅读这部分) 开发环境: V

ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用

文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-ef-6-get-started-model.html 上一节:ASP.NET MVC5 + EF6 入门教程 (5) Model和Entity Framework 源码下载:点我下载 一.Razor简介 在解决方案资源管理器中查看Views文件夹下的文件,如下图所示. 文件的后缀名都是.cshtml.这是什么文件呢?顾名思义,cshtml = cs + html,就是一个包含C S

ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB  升级后界面效果如下: 日程管理   http://www.cnblogs.com/ymnets/p/7094914.html 任务调度系统界面 http://www.cnblogs.com/ymnets/p/5065154.html 系统权限全套完整图  http://www.cnblogs.com/ymnets/p/5065201.html 系统

构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(1)-前言与目录(持续更新中...)

开篇:从50开始系统已经由MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+EF6+Unity4.x+Quartz 2.3 +easyui 1.4.3. 从50节起为MVC5+EF6+Unity4.x+Quartz 2.3 +easyui 1.4.3.的特性文章 所以你们也要更新你们的环境 功能不变属于无缝接入,最大改变只在UI,初学同学,直接使用MVC5 开发工具:VS2013+SQL2012 相关代码:演示地址暂时关闭   第2讲源码下载 

ASP.NET MVC5+EF6+EasyUI 后台管理系统-关于WebApi的用法

1:ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-WebApi与Unity注入 使用Unity是为了使用我们后台的BLL和DAL层 2:ASP.NET MVC5+EF6+EasyUI 后台管理系统(2)-WebApi与Unity注入-配置文件 3:ASP.NET MVC5+EF6+EasyUI 后台管理系统(3)-MVC WebApi 用户验证 (1) 4:ASP.NET MVC5+EF6+EasyUI 后台管理系统(4)-MVC WebApi 用户验证 (2) 以往我们讲