一、创建项目解决方案

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类:

 namespace Wchl.EFDal
{
/// <summary>
/// 自定义的EF上下文容器类
/// </summary>
public class BaseDBContext: DbContext
{
/// <summary>
/// 负责根据指定的数据库链接字符串,初始化EF
/// </summary>
public BaseDBContext() : base("name=DonationEntities") { }
}
}

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

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

BaseDal类:

 namespace Wchl.EFDal
{
/// <summary>
/// 负责操作数据库中的所有表的普通增,删,查,改操作的
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public class BaseDal<TEntity> where TEntity:class
{
//1.0实例化EF上下文容器对象
BaseDBContext db = new BaseDBContext(); DbSet<TEntity> _dbset; public BaseDal()
{
//初始化
_dbset = db.Set<TEntity>();
} #region 查询
public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
{
return _dbset.Where(where).ToList();
}
#endregion }
}

2.2创建CompanyDal类和DonationDetailDal来继承BaseDal

CompanyDal类:

 namespace Wchl.EFDal
{
public class CompanyDal:BaseDal<Company>
{
}
}

DonationDetailDal类:

 namespace Wchl.EFDal
{
public class DonationDetailDal:BaseDal<DonationDetail>
{
//可以各自类的独有的方法
}
}

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

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

 namespace Wchl.EFBLL
{
public class BaseBLL<TEntity> where TEntity:class
{
//初始化BaseDal泛型类的对象
BaseDal<TEntity> bdal = new BaseDal<TEntity>(); public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
{
return bdal.Query(where);
}
}
}

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

DonationDetailBLL类:

 namespace Wchl.EFBLL
{
public class DonationDetailBLL:BaseBLL<DonationDetail>
{
}
}

CompanyBLL类:

 namespace Wchl.EFBLL
{
public class CompanyBLL:BaseBLL<Company>
{
}
}

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

5.1 创建Test方法

         public ActionResult Test()
{
CompanyBLL cbll = new CompanyBLL(); return View(cbll.Query(c=>true));
}

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

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

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

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

BaseDal类:

 namespace Wchl.EFDal
{
/// <summary>
/// 负责操作数据库中的所有表的普通增,删,查,改操作的
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public class BaseDal<TEntity> where TEntity:class
{
//1.0实例化EF上下文容器对象
BaseDBContext db = new BaseDBContext(); DbSet<TEntity> _dbset; public BaseDal()
{
//初始化
_dbset = db.Set<TEntity>();
} #region 查询
public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
{
return _dbset.Where(where).ToList();
} public List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> where,string[] tableNames)
{
//将子类_dbset 赋值给父类的query
DbQuery<TEntity> query = _dbset; foreach (var item in tableNames)
{
//遍历要连表的表名称,最终得到所有连表以后的DbQuery对象
query = query.Include(item);
}
return query.Where(where).ToList();
}
#endregion #region 新增
public void Add(TEntity model)
{
_dbset.Add(model);
}
#endregion #region 编辑
public void Edit(TEntity model,string[] propertyName)
{
if (model == null)
{
throw new Exception("model必须为实体的对象");
}
if (propertyName == null || propertyName.Any() == false)
{
throw new Exception("必须至少指定一个要修改的属性");
} //将model追加到EF容器
DbEntityEntry entry = db.Entry(model); entry.State = EntityState.Unchanged; foreach (var item in propertyName)
{
entry.Property(item).IsModified = true;
}
}
#endregion #region 物理删除
//EntityState.Unchanged
public void Delete(TEntity model, bool isAddedEFContext)
{
if (isAddedEFContext == false)
{
_dbset.Attach(model);
}
//修改状态为deleted
_dbset.Remove(model);
}
#endregion #region 统一执行保存
public int SaveChanges()
{
return db.SaveChanges();
}
#endregion }
}

七、完善BLL层BaseBLL类的方法

BaseBLL类:

 namespace Wchl.EFBLL
{
public class BaseBLL<TEntity> where TEntity:class
{
//初始化BaseDal泛型类的对象
BaseDal<TEntity> bdal = new BaseDal<TEntity>();
#region 查询
public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
{
return bdal.Query(where);
} public List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> where, string[] tableNames)
{
return bdal.QueryJoin(where, tableNames);
}
#endregion #region 新增 public void Add(TEntity model)
{
bdal.Add(model);
} #endregion #region 编辑 /// <summary>
/// 要求:model必须是自己定义的实体,此时没有追加到EF容器中
/// </summary>
/// <param name="model"></param>
public void Edit(TEntity model, string[] propertyName)
{
bdal.Edit(model, propertyName);
} #endregion #region 物理删除 /// <summary>
/// model必须是自己定义的,一般是按照主键来删除
/// </summary>
/// <param name="model">要删除的实体对象</param>
/// <param name="isAddedEFContext">true:表示model以及追加到了ef容器,false:未追加</param>
public void Delete(TEntity model, bool isAddedEFContext)
{
bdal.Delete(model, isAddedEFContext);
} #endregion #region 统一执行sql语句 public int SaveChanges()
{
return bdal.SaveChanges();
} #endregion }
}

八、mvc调用测试

   public ActionResult Test()
{
CompanyBLL cbll = new CompanyBLL(); //新增测试:
Company model = new Company()
{
CName = "测试1111111"
};
cbll.Add(model); //修改
//Company model1 = new Company()
//{
// cID = 8,
// CName = "测试22221"
//}; //cbll.Edit(model1, new string[] { "CName" }); //删除
var model2 = cbll.Query(c => c.cID == 8).FirstOrDefault();
cbll.Delete(model2, true);//执行sql语句 打开关闭了一次ado.net链接 //统一将上面的新增,编辑,删除分别生成insert,update,delete语句一次性发送给数据库执行
cbll.SaveChanges(); return View(cbll.Query(c=>true));
}

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

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

    用http://ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统 背景:前段时间,给一家公司做外包(就是图标是朵菊花那家).为了尽快实现交付,网上四处寻找适合中小型企 ...

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

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB  升级后界面效果如下: 任务调度系统界面 http: ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入

    系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级

    系统很久没有更新内容了,期待已久的更新在今天发布了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+E ...

  5. 关于ASP.NET或VS2005 搭建三层架构的理解

    最近想学习ASP.NET建网站,关于ASP.NET或VS2005 搭建三层架构的理解,网上摘录了一些资料,对于第(2)点的讲解让我理解印象深刻,如下: (1)为何使用N层架构? 因为每一层都可以在仅仅 ...

  6. 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 MVC ...

  7. 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统

    开篇:从50开始系统已经由MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+EF6+Unity4.x+Quartz 2.3 +easyui 1.4. ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统-WebApi的用法与调试

    1:ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-WebApi与Unity注入 使用Unity是为了使用我们后台的BLL和DAL层 2:ASP.NET MVC5+EF6+Easy ...

  9. 构建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简单的登录并 ...

随机推荐

  1. 在VS2015 RC打开CTP中创建的工程

    VS2015终于出了RC了!小伙伴们快来安装试用吧,地址在这里,还有新的Windows 10开发工具哦,要不然是开发不了Universal Windows App的,安装前记得卸载CTP版本. 新的R ...

  2. Linux1:Linux概述

    为什么服务器尤其大型服务器都使用Linux系统 服务器尤其是大型服务器一般都使用Linux系统,有以下几点原因: 1.成本低,Linux操作系统是免费的 2.安全性好,Linux采取了许多的安全措施, ...

  3. 【C语言学习】《C Primer Plus》第6章 C控制语句:循环

    学习总结 1.循环的语法跟其他语言的没差多少,可能大多数语言都在C的基础上发展出来的,所以大同小异不奇怪. 2.在判断表达式里,C语言只有0被认为是假,所有非零值正整数都被认为真. #include ...

  4. 使用you-get下载视频网站视频或其他

    使用you-get下载视频网站视频或其他 文/玄魂 目录 使用you-get下载视频网站视频或其他 前言 1.1 下载.安装 依赖 exe安装 pip安装 Antigen安装 Git 克隆源码 Hom ...

  5. Hadoop Pig简介、安装、试用

    相比Java的MapReduce api,Pig为大型数据集的处理提供了更高层次的抽象,与MapReduce相比,Pig提供了更丰富的数据结构,一般都是多值和嵌套的数据结构.Pig还提供了一套更强大的 ...

  6. 去它的h5,我还是用js写原生跨平台app吧

    智能手机功能越来越强大,已经在逐渐替代电脑的作用.百度.腾讯.阿里的移动端日活数也在逐步的赶上甚至超越电脑端用户.叫喊着“mobile first”的公司越来越多,App开发者应运而生,且队伍日趋庞大 ...

  7. Powershell--批量拆分SQL语句为事务并批处理

    作为DBA,时不时会遇到将数据导入到数据库的情况,假设业务或研发提供一个包含上百万行INSERT语句的脚本文件,而且这些INSERT 语句没有使用GO来进行批处理拆分,那么直接使用SQLCMD来执行会 ...

  8. [ACM_几何] Wall

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28417#problem/E 题目大意:依次给n个点围成的一个城堡,在周围建围墙,要求围墙 ...

  9. Direct2D教程(外篇)环境配置

    2014年世界杯首场淘汰赛马上开始了,闲着没事,整理以前的博客草稿打发时间,意外的发现这篇文章,本来是打算加入到Direct2D那个系列的,不知道为什么把它给遗漏了.环境配置,对于熟手来说,不是什么重 ...

  10. git 修改管理

    查看修改: 撤销某一文件的修改(还没提交): 撤销所有文件的修改: git checkout .