从这一部分开始做后台管理,首先是基本框架的
在Data项目的引用上右键-> 管理NuGet程序包。
在弹出的窗口中选择 EntityFramework 安装
在Data项目上点右键新建文件夹Type。在文件夹内添加类【OrderType】,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//创建2014.12.8 namespace Data.Types { /// <summary> /// 排序类型 /// </summary> public enum OrderType { /// <summary> /// 不排序 /// </summary> No, /// <summary> /// 正序 /// </summary> Asc, /// <summary> /// 倒序 /// </summary> Desc } } |
在Data项目上点右键新建类输入类名【BaseRepository】,这个类主要负责数数据的存取。
类内添加私有成员DbContext _baseDbContext用来在数据库进行增、删、改和查询。
BaseRepository的构造函数public BaseRepository(DbContext dbContext)中dbContext为数据上下文。在该类中写了一些数据的增删改和查询方法。整个代码如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
using Ninesky.Data.Types; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Linq.Expressions; namespace Ninesky.Data { /// <summary> /// 数据仓储基类 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> /// <typeparam name="T"></typeparam> public class BaseRepository<T> where T : class { private DbContext _baseDbContext; /// <summary> /// 构造函数 /// </summary> /// <param name="dbContext">数据上下文</param> public BaseRepository(DbContext dbContext) { _baseDbContext = dbContext; } /// <summary> /// 添加 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public T Add(T entity, bool isSave = true) { _baseDbContext.Set<T>().Add(entity); if (isSave) _baseDbContext.SaveChanges(); return entity; } /// <summary> /// 批量添加【立即执行】 /// </summary> /// <param name="entities">数据列表</param> /// <returns>添加的记录数</returns> public int AddRange(IEnumerable<T> entities, bool isSave = true) { _baseDbContext.Set<T>().AddRange(entities); return isSave ? _baseDbContext.SaveChanges() : 0; } /// <summary> /// 修改 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public bool Update(T entity, bool isSave = true) { _baseDbContext.Set<T>().Attach(entity); _baseDbContext.Entry<T>(entity).State = EntityState.Modified; return isSave ? _baseDbContext.SaveChanges() > 0 : true; } /// <summary> /// 删除 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public bool Delete(T entity, bool isSave = true) { _baseDbContext.Set<T>().Attach(entity); _baseDbContext.Entry<T>(entity).State = EntityState.Deleted; return isSave ? _baseDbContext.SaveChanges() > 0 : true; } /// <summary> /// 批量删除 /// </summary> /// <param name="entities">数据列表</param> /// <param name="isSave">是否立即保存</param> /// <returns>删除的记录数</returns> public int DeleteRange(IEnumerable<T> entities, bool isSave = true) { _baseDbContext.Set<T>().RemoveRange(entities); return isSave ? _baseDbContext.SaveChanges() : 0; } /// <summary> /// 保存 /// </summary> /// <returns>受影响的记录数</returns> public int Save() { return _baseDbContext.SaveChanges(); } /// <summary> /// 是否有满足条件的记录 /// </summary> /// <param name="anyLamdba">条件表达式</param> /// <returns></returns> public bool Any(Expression<Func<T, bool>> anyLamdba) { return _baseDbContext.Set<T>().Any(anyLamdba); } /// <summary> /// 查询记录数 /// </summary> /// <param name="countLamdba">查询表达式</param> /// <returns>记录数</returns> public int Count(Expression<Func<T, bool>> countLamdba) { return _baseDbContext.Set<T>().Count(countLamdba); } /// <summary> /// 查找实体 /// </summary> /// <param name="ID">实体ID</param> /// <returns></returns> public T Find(int ID) { return _baseDbContext.Set<T>().Find(ID); } /// <summary> /// 查找实体 /// </summary> /// <param name="findLambda">Lambda表达式</param> /// <returns></returns> public T Find(Expression<Func<T, bool>> findLambda) { return _baseDbContext.Set<T>().SingleOrDefault(findLambda); } /// <summary> /// 查找所有列表 /// </summary> /// <returns></returns> public IQueryable<T> FindAll() { return FindList<int>(0, T => true, OrderType.No, null); } /// <summary> /// 查找数据列表 /// </summary> /// <param name="number">返回的记录数【0-返回所有】</param> /// <param name="whereLandba">查询条件</param> /// <param name="orderType">排序方式</param> /// <param name="orderLandba">排序条件</param> /// <returns></returns> public IQueryable<T> FindList<TKey>(int number, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba) { IQueryable<T> _tIQueryable = _baseDbContext.Set<T>().Where(whereLandba); switch (orderType) { case OrderType.Asc: _tIQueryable = _tIQueryable.OrderBy(orderLandba); break; case OrderType.Desc: _tIQueryable = _tIQueryable.OrderByDescending(whereLandba); break; } if (number > 0) _tIQueryable = _tIQueryable.Take(number); return _tIQueryable; } /// <summary> /// /// </summary> /// <typeparam name="TKey">排序字段类型</typeparam> /// <param name="pageIndex">页码【从1开始】</param> /// <param name="pageNumber">每页记录数</param> /// <param name="totalNumber">总记录数</param> /// <param name="whereLandba">查询表达式</param> /// <param name="orderType">排序类型</param> /// <param name="orderLandba">排序表达式</param> /// <returns></returns> public IQueryable<T> FindPageList<TKey>(int pageIndex, int pageNumber, out int totalNumber, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba) { IQueryable<T> _tIQueryable = _baseDbContext.Set<T>().Where(whereLandba); totalNumber = _tIQueryable.Count(); switch (orderType) { case OrderType.Asc: _tIQueryable = _tIQueryable.OrderBy(orderLandba); break; case OrderType.Desc: _tIQueryable = _tIQueryable.OrderByDescending(whereLandba); break; } _tIQueryable = _tIQueryable.Skip((pageIndex - 1) * pageNumber).Take(pageNumber); return _tIQueryable; } } } |
在data项目右键添加【BaseService】,此类通过调用BaseRepository进行数据处理,作为业务逻辑的基类,其他业务类继承自此类。这个类的方法与BaseRepository比较相似,建立此类的主要体现分层的思路,一些数据访问的异常处理应该放在此类中。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
using Ninesky.Data.Types; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Linq.Expressions; namespace Ninesky.Data { /// <summary> /// 业务逻辑基类 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class BaseService<T> where T : class { private BaseRepository<T> _baseRepository; /// <summary> /// 创建业务逻辑类 /// </summary> /// <param name="dbContext">数据上下文</param> public BaseService(DbContext dbContext) { _baseRepository = new BaseRepository<T>(dbContext); } /// <summary> /// 添加 /// </summary> /// <param name="entity">数据实体</param> /// <returns>添加后的数据实体</returns> public T Add(T entity, bool isSave = true) { return _baseRepository.Add(entity, isSave); } ///// <summary> ///// 添加【必须先实例化才能使用】 ///// </summary> ///// <param name="entity">数据实体</param> ///// <returns>添加后的记录ID</returns> //public virtual int Add(T entity) { return 0; } /// <summary> /// 批量添加 /// </summary> /// <param name="entities">数据列表</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public int AddRange(IEnumerable<T> entities, bool isSave = true) { return _baseRepository.AddRange(entities, isSave); } /// <summary> /// 修改 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public bool Update(T entity, bool isSave = true) { return _baseRepository.Update(entity, isSave); } /// <summary> /// 删除 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public bool Delete(T entity, bool isSave = true) { return _baseRepository.Delete(entity, isSave); } /// <summary> /// 批量删除 /// </summary> /// <param name="entities">数据列表</param> /// <param name="isSave">是否立即保存</param> /// <returns>删除的记录数</returns> public int DeleteRange(IEnumerable<T> entities, bool isSave = true) { return _baseRepository.DeleteRange(entities, isSave); } /// <summary> /// 保存 /// </summary> /// <returns>受影响的记录数</returns> public int Save() { return _baseRepository.Save(); } /// <summary> /// 查询记录数 /// </summary> /// <param name="countLamdba">查询表达式</param> /// <returns>记录数</returns> public int Count(Expression<Func<T, bool>> countLamdba) { return _baseRepository.Count(countLamdba); } /// <summary> /// 查找实体 /// </summary> /// <param name="ID">实体ID</param> /// <returns></returns> public T Find(int ID) { return _baseRepository.Find(ID); } /// <summary> /// 查找实体 /// </summary> /// <param name="findLambda">Lambda表达式</param> /// <returns></returns> public T Find(Expression<Func<T, bool>> findLambda) { return _baseRepository.Find(findLambda); } /// <summary> /// 查找所有列表 /// </summary> /// <returns></returns> public IQueryable<T> FindAll() { return _baseRepository.FindAll(); } /// <summary> /// 查找数据列表 /// </summary> /// <param name="number">返回的记录数【0-返回所有】</param> /// <param name="whereLandba">查询条件</param> /// <param name="orderType">排序方式</param> /// <param name="orderLandba">排序条件</param> /// <returns></returns> public IQueryable<T> FindList<TKey>(int number, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba) { return _baseRepository.FindList<TKey>(number, whereLandba, orderType, orderLandba); } /// <summary> /// /// </summary> /// <typeparam name="TKey">排序字段类型</typeparam> /// <param name="pageIndex">页码【从1开始】</param> /// <param name="pageNumber">每页记录数</param> /// <param name="totalNumber">总记录数</param> /// <param name="whereLandba">查询表达式</param> /// <param name="orderType">排序类型</param> /// <param name="orderLandba">排序表达式</param> /// <returns></returns> public IQueryable<T> FindPageList<TKey>(int pageIndex, int pageNumber, out int totalNumber, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba) { return FindPageList<TKey>(pageIndex, pageNumber, out totalNumber, whereLandba, orderType, orderLandba); } } } |
在User项目的引用上点右键添加System.ComponentModel.DataAnnotations的引用和Ninesky.Data项目、E的引用。
在User项目上点右键新建文件夹Models,在文件夹中添加类Administrator。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using System; using System.ComponentModel.DataAnnotations; namespace Ninesky.User.Models { /// <summary> /// 管理员模型 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class Administrator { [Key] public int AdministratorID { get; set; } /// <summary> /// 管理员账号 /// </summary> [Required(ErrorMessage = "必须输入{0}")] [Display(Name = "管理员账号")] public string Account { get; set; } /// <summary> /// 管理员名称 /// </summary> [Required(ErrorMessage = "必须输入{0}")] [Display(Name = "管理员名称")] public string Name { get; set; } /// <summary> /// 密码 /// </summary> [Required(ErrorMessage = "必须输入{0}")] [Display(Name = "密码")] [DataType(DataType.Password)] public string Password { get; set; } /// <summary> /// 创建时间 /// </summary> public DateTime CreateDate { get; set; } /// <summary> /// 上次登陆Ip /// </summary> public string LoginIp { get; set; } /// <summary> /// 上次登陆日期 /// </summary> public Nullable<DateTime> LoginTime { get; set; } } } |
在User项目上点右键添加AdministratorService类,该类继承自BaseService。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Ninesky.Data; using Ninesky.User.Models; namespace Ninesky.User { /// <summary> /// 管理员业务逻辑类 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class AdministratorService:BaseService<Administrator> { public AdministratorService(DbContext dbContext) : base(dbContext) { } } } |
在Site项目上点右键添加类【NineskyDbContext】,继承自DbContext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Entity; using Ninesky.User.Models; namespace Ninesky.Website { /// <summary> /// 网站数据上下文 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class NineskyDbContext : DbContext { public DbSet<Administrator> Administrators { get; set; } public NineskyDbContext() : base("name=NineskyConnection") { Database.SetInitializer<NineskyDbContext>(new CreateDatabaseIfNotExists<NineskyDbContext>()); } } } |
打开Web.config文件,在</configSections><appSettings>之间添加数据库的连接
1 2 3 |
<connectionStrings> <add name="NineskyConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\Ninesky.mdf;Initial Catalog=Ninesky;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> </connectionStrings> |
在Website项目上点右键添加类【ContextFactory】,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System.Runtime.Remoting.Messaging; namespace Ninesky.Website { /// <summary> /// 上下文简单工厂 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class ContextFactory { /// <summary> /// 获取当前数据上下文 /// </summary> /// <returns>数据上下文</returns> public static NineskyDbContext GetCurrentContext() { NineskyDbContext _nineskyDbContext = CallContext.GetData("NineskyDbContext") as NineskyDbContext; if (_nineskyDbContext == null) { _nineskyDbContext = new NineskyDbContext(); CallContext.SetData("NineskyDbContext", _nineskyDbContext); } return _nineskyDbContext; } } } |
在Site项目的Config区域的Controller文件夹上点右键添加Home控制器,类型选择【MVC5控制器-空】。在添加的控制器中添加【Index】 action
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace Ninesky.Website.Areas.Config.Controllers { /// <summary> /// 主界面 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class HomeController : Controller { // GET: Config/Home public ActionResult Index() { return View(); } } } |
在Config区域Views/Share文件夹添加布局页【_Layout.cshtml】
在Index action上右键添加一个空视图
===========================
代码下载:http://pan.baidu.com/s/1sj6Ya2D
from:http://www.cnblogs.com/mzwhj/p/4155896.html