ASP.NET MVC系列 框架搭建(一)之倉儲層的搭建


大神勿噴,小神默默學。

會了就是不值一提的東西,不會就是絕對的高大上。

最后上傳源碼。希望能給讀者帶來一些新的認識及知識。

還沒上過頭條。。各位大神,請點支持一下小弟。

陸續更新。更新到你會為止!!

我不是話嘮,我只把重點點出來,細枝末節的不懂的可以留言探討。這個系列的最后,我會再統一的把大家的問題,列在一篇新的Blog。工作需要規划,寫博客也是如此。

倉儲層:待優化

基接口:約束

子接口:實現基接口。進一步約束子倉儲中特殊的方法。

*基倉儲:具體實現,子類繼承接口的方法。

    這步最難,最重要!

    ①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
  {
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM