EF結合三層:三層中數據層父類和業務層父類的使用


 

     今天我們主要討論下數據層父類和業務層父類的使用。眾所周知,數據層無非就是實現增刪改查的方法。無論是哪個實體類,無非就是為了實現增刪改查方法,所有我們在三層的DAL層封裝了一個BaseDAL類,來做增刪改查。在BLL層封裝了一個BaseBLL類,來做增刪改查。如果在Model層,通過ModelFirst的方式,又添加了新的實體(YYY),那么在DAL層只需要定義一個類YYYDAL,並讓YYYDAL繼承自BaseDAL即可 。同理,在BLL層, 只需要定義一個類YYYBLL,並讓其繼承自BaseBLL即可 。下面我們來完成這個描述。

    由於該文章的側重點數據層父類和業務層父類的使用。所以我們就不再領着大家搭建三層結構。默認大家已經創建好的程序的架構。

   

    並且在edmx模型中我們已經創建了兩個實體。這里我們使用CustomerTicket(由於最近在講解影院售票系統)

 

步驟一:先在DAL層創建一個CustomerDAL類,並且書寫對應的增刪改查以及分頁的方法。

 1 public class CustomerDAL
 2     {
 3        //數據庫上下文對象
 4        YYMMVCEntities db = new YYMMVCEntities();
 5        /// <summary>
 6        /// 新增操作
 7        /// </summary>
 8        public int Add(Customer customer)
 9        {
10            db.Customers.AddObject(customer);
11            //保存成功后會將自增的ID設置成customer的主鍵屬性
12           return db.SaveChanges();
13        }       
14        //刪除
15        public int DeleteBy(int cid)
16        {
17            Customer customer=new Customer(){CID = cid};
18            db.Customers.Attach(customer);
19            db.Customers.DeleteObject(customer);
20            return db.SaveChanges();
21        }
22        //根據條件刪除
23        public int DeleteExpression(System.Linq.Expressions.Expression<Func<Customer,bool>> deleWhere)
24        {
25            List<Customer> customers=db.Customers.Where(deleWhere).ToList();
26           customers.ForEach(m=>db.Customers.DeleteObject(m));
27            return db.SaveChanges();
28        }
29 
30        //修改方法
31        public  int Modify(Customer customer)
32        {
33            db.Attach(customer);
34            db.ObjectStateManager.ChangeObjectState(customer, EntityState.Modified);
35            return db.SaveChanges();
36        }
37        //查詢
38        publicList<Customer> GetListBy(System.Linq.Expressions.Expression<Func<Customer,bool>> seleWhere)
39        {
40            return db.Customers.Where(seleWhere).ToList();
41        }
42        //查詢和排序
43        public List<Customer> GetListBy<Tkey>(System.Linq.Expressions.Expression<Func<Customer,bool>> seleWhere,System.Linq.Expressions.Expression<Func<Customer,Tkey>> orderWhere)
44        {
45            return db.Customers.Where(seleWhere).OrderBy(orderWhere).ToList();
46        }
47        //分頁查詢
48        public List<Customer> GetListPaged(int pageIndex,int pageSize,System.Linq.Expressions.Expression<Func<Customer,bool>> orderbyWhere)
49        {
50            return db.Customers.OrderBy(orderbyWhere).Skip((pageIndex - 1)*pageSize).Take(pageSize).ToList();
51        } 
52    }

 

第二步:書寫BaseDAL類

    然后我們在DAL層新建一個BaseDAL類,類中內容是通過CustomerDAL修改而來的,將出現Customer的地方替換成了T,出現Customers的地方改成了CreateObjectSet<T>()

,修正后的類如下

 

 1 public class BaseDAL<T> where T:class,new()
 2     {
 3         //數據庫上下文對象
 4         YYMMVCEntities db = new YYMMVCEntities();
 5         /// <summary>
 6         /// 新增操作
 7         /// </summary>
 8         public int Add(T customer)
 9         {
10             //必須限定T的類型,只能為引用類型
11             db.CreateObjectSet<T>().AddObject(customer);
12             //保存成功后會將自增的ID設置成customer的主鍵屬性
13             return db.SaveChanges();
14         }
15 
16         //刪除
17         public int DeleteBy(T model)
18         {
19             
20             db.CreateObjectSet<T>().Attach(model);
21             db.CreateObjectSet<T>().DeleteObject(model);
22             return db.SaveChanges();
23         }
24         //根據條件刪除
25         public int DeleteExpression(System.Linq.Expressions.Expression<Func<T, bool>> deleWhere)
26         {
27             List<T> customers = db.CreateObjectSet<T>().Where(deleWhere).ToList();
28             customers.ForEach(m => db.CreateObjectSet<T>().DeleteObject(m));
29             return db.SaveChanges();
30         }
31 
32         //修改方法
33         public int Modify(T customer)
34         {
35             db.CreateObjectSet<T>().Attach(customer);
36             db.ObjectStateManager.ChangeObjectState(customer, EntityState.Modified);
37             return db.SaveChanges();
38         }
39 
40         //查詢
41         public List<T> GetListBy(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere)
42         {
43             return db.CreateObjectSet<T>().Where(seleWhere).ToList();
44         }
45         //查詢和排序
46         public List<T> GetListBy<Tkey>(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere, System.Linq.Expressions.Expression<Func<T, Tkey>> orderWhere)
47         {
48             return db.CreateObjectSet<T>().Where(seleWhere).OrderBy(orderWhere).ToList();
49         }
50         //分頁查詢
51         public List<T> GetListPaged(int pageIndex, int pageSize, System.Linq.Expressions.Expression<Func<T, bool>> orderbyWhere)
52         {
53             return db.CreateObjectSet<T>().OrderBy(orderbyWhere).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
54 
55         } 
56    }

      其中public class BaseDAL<T> where T:class,new()中where T:class代表T的類型只能是引用類型,new()代表T類型必須有無參的構造。

 到這里我們已經完成了對DAL層父類的書寫。

第三步:書寫BaseBLL類

     接下來,我們就可以書寫BaseBLL類了,當然,抽取BaseBLL類的方式和抽取BaseDAL的方式基本一致,在這里就直接寫出BaseBLL的類的代碼結構了。

 1 public class BaseBLL<T> where T:class,new ()
 2     {
 3        protected  BaseDAL<T> dal = new BaseDAL<T>();
 4         /// <summary>
 5         /// 新增操作
 6         /// </summary>
 7         public int Add(T customer)
 8         {
 9             return dal.Add(customer);
10         }
11 
12         //刪除
13         public int DeleteBy(T cid)
14         {
15             return dal.DeleteBy(cid);
16         }
17         //根據條件刪除
18         public int DeleteExpression(System.Linq.Expressions.Expression<Func<T, bool>> deleWhere)
19         {
20             return dal.DeleteExpression(deleWhere);
21         }
22 
23         //修改方法
24         public int Modify(T customer)
25         {
26             return dal.Modify(customer);
27         }
28 
29         //查詢
30         public List<T> GetListBy(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere)
31         {
32             return dal.GetListBy(seleWhere);
33         }
34         //查詢和排序
35         public List<T> GetListBy<Tkey>(System.Linq.Expressions.Expression<Func<T, bool>> seleWhere, System.Linq.Expressions.Expression<Func<T, Tkey>> orderWhere)
36         {
37             return dal.GetListBy(seleWhere, orderWhere);
38         }
39         //分頁查詢
40         public List<T> GetListPaged(int pageIndex, int pageSize, System.Linq.Expressions.Expression<Func<T, bool>> orderbyWhere)
41         {
42             return dal.GetListPaged(pageIndex, pageSize, orderbyWhere);
43 
44         } 
45     }

 

 其實,我們發現一個問題,就先現在我們的BLL層就是起到了一個數據隔離的作用。

       然后我們就可以在對應的DAL層和BLL層創建對應的子類來繼承自各自的父類。接下來我們通過ModelFirst的方式修改edmx模型,在其中添加一個新的實體Book,並且建立Customer和Book之間的關系(1對多)。如下圖:

 

步驟四:在DAL層添加BookDAL類,並且繼承自BaseDAL;在BLL層添加BookBLL類,並且繼承自BaseBLL類。

在頁面的Load事件中書寫如下代碼:

1      if (!IsPostBack)
2             {
3                 BookBLL bll=new BookBLL();
4                 List<Book> list=bll.GetListBy(m => m.ID > 0);
5                 Repeater1.DataSource = list;
6                 Repeater1.DataBind();
7             }

 就可以驗證子類對象是否成功繼承父類的方法。

 

好的,我們今天的探討到此結束!

 


免責聲明!

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



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