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类:
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搭建三层实例的更多相关文章
- 用ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统
用http://ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统 背景:前段时间,给一家公司做外包(就是图标是朵菊花那家).为了尽快实现交付,网上四处寻找适合中小型企 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)
开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 任务调度系统界面 http: ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入
系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级
系统很久没有更新内容了,期待已久的更新在今天发布了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+E ...
- 关于ASP.NET或VS2005 搭建三层架构的理解
最近想学习ASP.NET建网站,关于ASP.NET或VS2005 搭建三层架构的理解,网上摘录了一些资料,对于第(2)点的讲解让我理解印象深刻,如下: (1)为何使用N层架构? 因为每一层都可以在仅仅 ...
- 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 ...
- 构建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. ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统-WebApi的用法与调试
1:ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-WebApi与Unity注入 使用Unity是为了使用我们后台的BLL和DAL层 2:ASP.NET MVC5+EF6+Easy ...
- 构建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简单的登录并 ...
随机推荐
- 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action
上篇讲到 请求到达 MvcRouteHandler ,并且透过 IRouteHandler.GetHttpHandler 获取到了真正的处理程序 MvcHandler 这次我们看看,MvcHandle ...
- Silverlight中异步调用WCF服务,传入回调函数
以前学的ASP.NET,调用的都是同步方法,同步方法的好处就是,一步一步走,完成这步才会走下一步.然而,WCF使用的都是异步方法,调用之后不管有没有获得结果就直接往下走,最可恶的是异步函数都是Void ...
- Linux head和tail命令
200 ? "200px" : this.width)!important;} --> 介绍 head和tail是一组想对应的命令,默认分别显示文件的开头和末尾10行记录. ...
- Linux 比较判断运算(if test)
200 ? "200px" : this.width)!important;} --> 介绍 本篇文章主要是列举在shell命令中常出现的一些用来做比较的运算符,这些运算符是 ...
- [异常解决] MPU6050启动异常读出陀螺仪和加速度计的值全为0的解决办法
在调试一个自己做的手环,每次用keil烧写好程序运行的蓝牙.陀螺仪都是正常的.但是掉电再上电之后蓝牙是好的.陀螺仪可以读出ID但是读出的加速度和角速度数据全为0. 下面是发生问题时main函数的前面部 ...
- 科蓝软件急招前端开发、PHP、.NET工程师
职位:前端开发 工作年限:不限 学历要求:大专 招聘人数:2 专业:不限 薪酬:面议 工作地点:浙江嘉兴.北京 岗位职责: 1.负责公司项目的UI设计: 2.负责将UI静态化 ...
- mac命令
mac下卸载nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}xc ...
- Atitit 破解qq空间(2)-------探测权限
Atitit 破解qq空间(2)-------探测权限 /AtiPlatf_cms/src/com/attilax/net/httpTest.java package com.attilax.net ...
- iOS-应用打包发布常见问题
这个月公司安排我一个人做iOS客户端开发,由于急着用,我先发布一个版本,由于第一次发布iOS应用,期间出了不少问题,记录于此. 1.使用Application Loader 发布时报错:Communi ...
- js 四舍五入函数 toFixed(),小数位数精度
js的加减乘除有时得到的结果的小数的位数非常大,这种结果非常难以读取,例如某两个数相乘得到的结果是:1.3921000000000001 这种结果小数的位数有点多,一般需要的结果是四舍无入的 1.39 ...