一、创建项目解决方案

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. 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action

    上篇讲到 请求到达 MvcRouteHandler ,并且透过 IRouteHandler.GetHttpHandler 获取到了真正的处理程序 MvcHandler 这次我们看看,MvcHandle ...

  2. Silverlight中异步调用WCF服务,传入回调函数

    以前学的ASP.NET,调用的都是同步方法,同步方法的好处就是,一步一步走,完成这步才会走下一步.然而,WCF使用的都是异步方法,调用之后不管有没有获得结果就直接往下走,最可恶的是异步函数都是Void ...

  3. Linux head和tail命令

    200 ? "200px" : this.width)!important;} --> 介绍 head和tail是一组想对应的命令,默认分别显示文件的开头和末尾10行记录. ...

  4. Linux 比较判断运算(if test)

    200 ? "200px" : this.width)!important;} --> 介绍 本篇文章主要是列举在shell命令中常出现的一些用来做比较的运算符,这些运算符是 ...

  5. [异常解决] MPU6050启动异常读出陀螺仪和加速度计的值全为0的解决办法

    在调试一个自己做的手环,每次用keil烧写好程序运行的蓝牙.陀螺仪都是正常的.但是掉电再上电之后蓝牙是好的.陀螺仪可以读出ID但是读出的加速度和角速度数据全为0. 下面是发生问题时main函数的前面部 ...

  6. 科蓝软件急招前端开发、PHP、.NET工程师

    职位:前端开发 工作年限:不限     学历要求:大专     招聘人数:2   专业:不限    薪酬:面议 工作地点:浙江嘉兴.北京 岗位职责: 1.负责公司项目的UI设计: 2.负责将UI静态化 ...

  7. mac命令

    mac下卸载nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}xc ...

  8. Atitit 破解qq空间(2)-------探测权限

    Atitit 破解qq空间(2)-------探测权限 /AtiPlatf_cms/src/com/attilax/net/httpTest.java  package com.attilax.net ...

  9. iOS-应用打包发布常见问题

    这个月公司安排我一个人做iOS客户端开发,由于急着用,我先发布一个版本,由于第一次发布iOS应用,期间出了不少问题,记录于此. 1.使用Application Loader 发布时报错:Communi ...

  10. js 四舍五入函数 toFixed(),小数位数精度

    js的加减乘除有时得到的结果的小数的位数非常大,这种结果非常难以读取,例如某两个数相乘得到的结果是:1.3921000000000001 这种结果小数的位数有点多,一般需要的结果是四舍无入的 1.39 ...