ASP.NET MVC系列 框架搭建(一)之仓储层的搭建
仓储层:待优化
基接口:约束
子接口:实现基接口。进一步约束子仓储中特殊的方法。
*基仓储:具体实现,子类继承接口的方法。
这步最难,最重要!
①db不能直接点出具体的Model,只能db.CreateObjectSet<T>().AddObject(entity);将实体“附加”到上下文。
②where和order方法需要传lamada。各自类型问题。where<T,bool> order<T,S>的使用。
③Select时候IEumarable<T>转换IQueryable<T>需要AsQueryable()方法。
子仓储:只写除了基类和接口的方法之外外特殊的需求方法。比如多表。
以UserInforRespository为例:
IBaseRespository.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
//添加System.Data.Entity引用
namespace LKBS.CommunicationPlatform.IDAL
{
public interface IBaseRespository<T> where T : class ,new()
{
//接口不需要上下文db
// int rowcount = 0;
//public 对接口方法无效
bool AddEntity(T entity);
bool DeleteEntity(T entity);
bool UpdateEntity(T entity);
T SelectOneEntity(Func<T, bool> wherelamda);
IQueryable<T> SelectAllEntityList(Func<T, bool> wherelamda);
IQueryable<T> SelectPageEntityList<S>(Func<T, S> orderLamda, Func<T, bool> whereLamda, int pageIndex, int pageSize, bool isAsc, out int rowcount);
}
}
BaseRespository.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using LKBS.CommunicationPlatform.Model;
using LKBS.CommunicationPlatform.IDAL;
using System.Data;
namespace LKBS.CommunicationPlatform.DAL
{
public class BaseRespository<T> where T : class,new()
{
ModelContainer db = new ModelContainer();
/// <summary>
/// 增加
/// </summary>
/// <param name="entity">增加实体,实体没赋的属性为NULL</param>
/// <returns></returns>
public bool AddEntity(T entity)
{
db.CreateObjectSet<T>().AddObject(entity);
//db.ObjectStateManager.ChangeObjectState(entity, EntityState.Added);
db.SaveChanges();
return true;
}
/// <summary>
/// 删除
/// </summary>
/// <param name="entity">方便附加到上下文一个实体,传入实体,用到只有ID</param>
/// <returns></returns>
public bool DeleteEntity(T entity)
{
//var temp= db.UserInfor.Where(userinfor=>userinfor.ID>=id).FirstOrDefault<UserInfor>();
//db.UserInfor.Attach(userinfor);
//db.ObjectStateManager.ChangeObjectState(userinfor, EntityState.Deleted);
db.CreateObjectSet<T>().AddObject(entity);
db.ObjectStateManager.ChangeObjectState(entity, EntityState.Deleted);
db.SaveChanges();
return true;
}
/// <summary>
/// 改
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public bool UpdateEntity(T entity)
{
//db.UserInfor.Attach(userinfor);
//db.ObjectStateManager.ChangeObjectState(userinfor, EntityState.Modified);
db.CreateObjectSet<T>().AddObject(entity);
db.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
db.SaveChanges();
return true;
}
/// <summary>
/// 单个实体
/// </summary>
/// <param name="wherelamda"></param>
/// <returns></returns>
public T SelectOneEntity(Func<T, bool> wherelamda)
{
var rowTemp = db.CreateObjectSet<T>().Where<T>(wherelamda).FirstOrDefault<T>();
return rowTemp;
}
/// <summary>
/// 查询 整张表或者多个实体
/// </summary>
/// <returns></returns>
public IQueryable<T> SelectAllEntityList(Func<T, bool> wherelamda)
{
var rowsTemp = db.CreateObjectSet<T>().Where<T>(wherelamda);
return rowsTemp.AsQueryable<T>();
}
int rowcount = 0;
//泛型方法 <S>就是约束参数的类型,传什么参数,“自动识别”<S>. 定义需要<S>,调用该方法可以省略 :因为传的参数就已确定<S>的类型
public IQueryable<T> SelectPageEntityList<S>(Func<T, S> orderLamda, Func<T, bool> whereLamda, int pageIndex, int pageSize, bool isAsc, out int rowcount)
{//非页数pageCount,是总行数
//IEnumerable<>
var temp = db.CreateObjectSet<T>().Where<T>(whereLamda);
rowcount = temp.Count<T>();
if (isAsc)
{
//IQueryable
IEnumerable<T> entityPageList =
temp
.OrderBy<T, S>(orderLamda)
.Skip<T>((pageIndex - 1) * pageSize).
Take<T>(pageSize);
//pageCount=db.UserInfor.
return entityPageList.AsQueryable();
}
else
{
IEnumerable<T> entityPageList =
//db.UserInfor
//.Where<UserInfor>(whereLamda)//u => u.ID > 0
temp
.OrderByDescending<T, S>(orderLamda)//u => u.ID
.Skip<T>((pageIndex - 1) * pageSize).
Take<T>(pageSize);
//pageCount=db.UserInfor.
return entityPageList.AsQueryable();
}
}
}
}
IUserInforRespository.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LKBS.CommunicationPlatform.Model;
namespace LKBS.CommunicationPlatform.IDAL
{
public interface IUserInforRespository:IBaseRespository<UserInfor>
{
}
}
UserInforRespository.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LKBS.CommunicationPlatform.Model;
using System.Data;
using LKBS.CommunicationPlatform.IDAL;
namespace LKBS.CommunicationPlatform.DAL
{
public class UserInforRespository:BaseRespository<UserInfor>,IUserInforRespository
{
}
}