我们现在先来看看数据库的生成顺序
居然是 Idal层排在第一,而 web层在第二,model层反而在第三 了
我们需要把 coomon 公用层放在第一,Model层放在第二,接下来是 Idal层,dal层,然后是bll层,最后是 web层,这个顺序怎么调整呢?
点击旁边的依赖项.
分别把每个项目所依赖的项目都勾选上,最后点击确认后,我们看看生成顺序.
这样,当我们生成 web层的时候,会自动从上到下生成 common,model,idal,dal,bll层.
我们对web层进行生成一下,顺便打开输出列表,就能看到所有项目的生成顺序已经调整成我们想要的顺序了
下面开始今天的,数据库访问层 Repository的实现,回顾上次结束时候的项目如下图所示.
我们今天的任务就是对 Repository 层的实现 ,这一层是继承接口 IRepository的,所以IRepository层的每个接口,我们都需要在Repository层来实现
(1)我们在数据库访问层(YouJiao.MvcWeb.Repository) 下面添加ProductRepository.cs(产品仓储),UserInfoRepository.cs(用户仓储),这些功能是为了实现对数据库的操作,也就是增删改查,我们先实现 ProductRepository.cs , 这个需要实现接口 IProductRepository , 代码如下
public class ProductRepository : IProductRepository { private ModelContainer db = new ModelContainer(); //获取EF上下文的实例 public IList<Product> LoadEneities(Func<Product, bool> whereLambda) { return db.Product.Where(whereLambda).ToList(); } public IList<Product> LoadPageEneities<S>(int pageSize, int pageIndex, out int total, Func<Product, bool> whereLambda, Func<Product, S> orderbyLambda, bool isAsc) { var tempList = db.Product.Where(whereLambda).ToList(); total = tempList.Count; if (isAsc) //如果是升序 { tempList = tempList.OrderBy<Product,S>(orderbyLambda) .Skip(pageIndex * pageSize - 1) //越过多少条 .Take(pageSize).ToList(); //取出多少条 } else { tempList = tempList.OrderByDescending<Product, S>(orderbyLambda) .Skip(pageIndex * pageSize - 1) .Take(pageSize).ToList(); } return tempList; } public Product AddEntity(Product model) { db.Product.AddObject(model); db.SaveChanges(); return model; } public bool DeleteEntity(Product model) { db.Product.Attach(model); db.ObjectStateManager.ChangeObjectState(model, EntityState.Deleted); return db.SaveChanges()>0; } public bool UpdateEntity(Product model) { db.Product.Attach(model); db.ObjectStateManager.ChangeObjectState(model, EntityState.Modified); return db.SaveChanges() > 0; } }
OK ProductRepository(产品仓储)的实现完毕,接下来是UserInfoRepository (用户仓储)
注意了,这里会有一个问题,我们的产品仓储和用户仓储都会用到数据库的操作(增删改查),那么我们怎么办呢,想必这里大家已经清楚该怎么办了,当我们遇到公共的东西的时候我们最好能够抽象出来实现一个固定的功能的基类,然后我们只对其进行继承操作。
我们抽象出一个 BaseRepository (基仓储)
public class BaseRepository<T> where T : class // 这里约束泛型T必须是个类 { private ModelContainer db = new ModelContainer(); //获取EF上下文的实例 public IList<T> LoadEneities(Func<T, bool> whereLambda) { return db.CreateObjectSet<T>().Where(whereLambda).ToList(); } public IList<T> LoadPageEneities<S>(int pageSize, int pageIndex, out int total, Func<T, bool> whereLambda, Func<T, S> orderbyLambda, bool isAsc) { var tempList = db.CreateObjectSet<T>().Where(whereLambda).ToList(); total = tempList.Count; if (isAsc) //如果是升序 { tempList = tempList.OrderBy(orderbyLambda) .Skip(pageIndex * pageSize - 1) //越过多少条 .Take(pageSize).ToList(); //取出多少条 } else { tempList = tempList.OrderByDescending(orderbyLambda) .Skip(pageIndex * pageSize - 1) .Take(pageSize).ToList(); } return tempList; } public T AddEntity(T model) { db.CreateObjectSet<T>().AddObject(model); db.SaveChanges(); return model; } public bool DeleteEntity(T model) { db.CreateObjectSet<T>().Attach(model); db.ObjectStateManager.ChangeObjectState(model, EntityState.Deleted); return db.SaveChanges() > 0; } public bool UpdateEntity(T model) { db.CreateObjectSet<T>().Attach(model); db.ObjectStateManager.ChangeObjectState(model, EntityState.Modified); return db.SaveChanges() > 0; } }
然后我们的 ProductRepository 就变成 先继承自 基仓储,然后实现了 IProductRepository
public class ProductRepository :BaseRepository<Product>,IProductRepository { }
同样 UserInfoRepository 也是如此
public class UserInfoRepository:BaseRepository<UserInfo>,IUserInfoRepository { }
如果用图来表示的话,如下