精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

LINQ to SQL實現(xiàn)數(shù)據(jù)訪問通用基類

開發(fā) 后端 數(shù)據(jù)庫運維
LINQ to SQL讓人著迷,在.Net應(yīng)用程序當(dāng)中,.它提供了一種安全,強大和非常靈活的方式執(zhí)行數(shù)據(jù)訪問,在當(dāng)前微軟傳道者介紹上看,很容易上手。

不幸的是,當(dāng)你對LINQ進行仔細研究后,我發(fā)現(xiàn)在多層架構(gòu)中使用LINQ的并不是十分容易。

本文介紹用LINQ to SQL實現(xiàn)數(shù)據(jù)層的典型的問題點 ,并提供了一個簡單,方便和靈活的方式來克服它們。

本文附帶的LINQ to SQL 實現(xiàn)數(shù)據(jù)訪問通用類有以下的特點:

實現(xiàn)了存儲庫模式,你可以用不到10行代碼執(zhí)行LINQ實體類型的CRUD (Create, Update, Delete)操作。
無縫協(xié)作,支持LINQ斷開模式(Disconnected LINQ Mode)。
在單一數(shù)據(jù)庫和LINQ實體間支持透明的數(shù)據(jù)庫更新和數(shù)據(jù)加載。
提供為一種方便的功能,在調(diào)試你的應(yīng)用程尋時候,它把所有執(zhí)行的SQL語句輸出控制臺。
本文將假定您對LINQ to SQL (也稱為DLINQ )有一個基本的了解并如何使用它。否則,,,回到此網(wǎng)頁,看看本教程入門系列,如何在多層次應(yīng)用中使用LINQ to SQL。

存在的問題

如果您只是在你的UI層直接用LinqToDataSource對象銜接數(shù)據(jù)庫,那LINQ to SQL太容易使用了。但是,這種做法不完全面向?qū)ο?,?dāng)然也不是一個可取的架構(gòu),除非你是為了快速編碼和臟亂的應(yīng)用程序,并且最終沒有去擴展的它打算。

相反,大多數(shù)開發(fā)人員把它們的應(yīng)用程序劃分成若干層,如下:

數(shù)據(jù)訪問層(Data Access Layer)

業(yè)務(wù)層 (Business Layer)

用戶界面層(UI Layer)

這就是所謂的多層數(shù)據(jù)庫應(yīng)用程序設(shè)計。LINQ to SQL將用于數(shù)據(jù)訪問層。

LINQ to SQL的問題是-盡管它的許多優(yōu)點-但是如果要實現(xiàn)數(shù)據(jù)層并不是很簡單。

請看下面的數(shù)據(jù)庫模式(database schema):

一旦你要加載和保存LINQ實體到同一個的數(shù)據(jù)上下文實例(data context instance)(這就是所謂“連接模式”),用LINQ實現(xiàn)數(shù)據(jù)層非常直接。

例如,讓我們從數(shù)據(jù)庫中獲取實體編號為1的客戶,改變屬性first name為“Homer”后在重新儲存到數(shù)據(jù)庫中。在一個多層數(shù)據(jù)庫應(yīng)用程序中,在UI或業(yè)務(wù)層的某個地方的代碼可能看起來就像這樣:

view plaincopy to clipboardprint?
1.         
2.       //create a new repository instance   
3.       CustomersRepository customersRepository = new CustomersRepository();   
4.       //load a customer instance and change it's FirstName;   
5.       Customer customer = customersRepository.Load(2);   
6.       customer.FirstName = "Homer";   
7.       //commmit customer to database   
8.       customersRepository.Save(customer);  
 

最簡單的方法來實現(xiàn)上面使用到的數(shù)據(jù)層加載和保存功能是:

view plaincopy to clipboardprint?
1.         
2.       static DataClassesDataContext context=new DataClassesDataContext();   
3.       public Customer Load(int CustomerID)   
4.       {   
5.       return context.Customers.Single(c => c.ID == CustomerID);   
6.       }   
7.       public void Save(Customer toSave)   
8.       {   
9.       context.SubmitChanges();   
10.   }  

這種方法是使用連接LINQ模式:數(shù)據(jù)上下文(data context)在當(dāng)前作用域一直有效(譯者注:一直保持連接狀態(tài)),所以在把實體保存到數(shù)據(jù)庫的時候,它總是可以重復(fù)使用。其中仍然連接到它。

當(dāng)然,這種做法方便并且在上述的單個例子中能運行,但它存在嚴重的并發(fā)問題,因為一個數(shù)據(jù)庫方面是用于所有數(shù)據(jù)庫操作。

當(dāng)調(diào)用方法Save(),bmitChanges提交的不僅僅是當(dāng)前Save 方法參數(shù)相關(guān)的LINQ實體,還包括所有改變了的實體。

但是及時把這個缺陷考慮在一邊,使用LINQ在一個多層ASP.NET應(yīng)用程序中,您還不能以相同方式實現(xiàn)數(shù)據(jù)層。首先,可能要求是這樣,在一個頁面請求中,LINQ實體被加載,然后在下一個頁面請求中,它更新并儲存到數(shù)據(jù)庫中的。.同時,您的原始數(shù)據(jù)上下文在當(dāng)前作用域內(nèi)已經(jīng)無效的(譯者住:HTTP協(xié)議是無狀態(tài)的),造成的您的LINQ實體游離。

還有許多其他情況下你需要使用斷開LINQ模式:例如您實現(xiàn)的數(shù)據(jù)庫層可能要作為一個Web服務(wù),提交(commit)以前序列化LINQ實體到數(shù)據(jù)庫等等。

用斷開模式的LINQ to SQL實現(xiàn)數(shù)據(jù)訪問層

所以,在斷開的LINQ模式下,我們?nèi)绾螌崿F(xiàn)數(shù)據(jù)層的Save( )方法?

我們必須

Detach the entity from the old data context從舊的數(shù)據(jù)上下文中分離實體

Create a new data context創(chuàng)建一個新的數(shù)據(jù)上下文

Attach the entity to the new context附加實體到新的數(shù)據(jù)上下文

Submit changes提交更改

在源代碼,它看起來像這樣:

 view plaincopy to clipboardprint?
1.         
2.       public Customer Load(int CustomerID)   
3.       {   
4.       DataClassesDataContext context = new DataClassesDataContext();   
5.       return context.Customers.Single(c => c.ID == CustomerID);   
6.       }   
7.         
8.       public void Save(Customer toSave)   
9.       {   
10.   //the old data context is no more, we need to create a new one   
11.   DataClassesDataContext context = new DataClassesDataContext();   
12.   //serialize and deserialize the entity to detach it from the   
13.   //old data context. This is not part of .NET, I am calling   
14.   //my own code here   
15.   toSave = EntityDetacher.Detach(toSave);   
16.   //is the entity new or just updated?   
17.   //ID is the customer table's identity column, so new entities should   
18.   //have an ID == 0   
19.   if (toSave.ID == 0)   
20.   {   
21.   //insert entity into Customers table   
22.   context.Customers.InsertOnSubmit(toSave);   
23.   }   
24.   else  
25.   {   
26.   //attach entity to Customers table and mark it as "changed"   
27.   context.Customers.Attach(toSave, true);   
28.   }   
29.   }  
 

現(xiàn)在只要你喜歡,您可以加載修改任意多實體,并且只提交他們一部分到數(shù)據(jù)庫。但由于使用斷開的LINQ ,這個程序并不會感知到LINQ實體之間的關(guān)系。

例如,假設(shè)在業(yè)務(wù)層或用戶界面層您要做到以下幾點:

view plaincopy to clipboardprint?
1.         
2.       //load currently selected customer from database   
3.       Customer customer = new CustomersRepository().Load(1);   
4.       //change the customer's first name   
5.       customer.FirstName = "Homer";   
6.       //add a new bill with two billingitems to the customer   
7.       Bill newbill = new Bill   
8.       {   
9.       Date = DateTime.Now,   
10.   BillingItems =   
11.   {   
12.   new BillingItem(){ItemPrice=10, NumItems=2},   
13.   new BillingItem(){ItemPrice=15, NumItems=1}   
14.   }   
15.   };   
16.   customer.Bills.Add(newbill);   
17.   //create a new provider to simulate new ASP.NET page request   
18.   //save the customer   
19.   new CustomersRepository().Save(customer);  
 

這個斷開模式下,上述Save( )方法將提交變更到FirstName列,但是忽略了new bill和billing items。為了做到這一點,我們還需要附加或插入遞歸所有相關(guān)的子實體(child entities):

 

view plaincopy to clipboardprint?

1.        

2.       public void Save(Customer toSave)  

3.       {  

4.       //the old data context is no more, we need to create a new one  

5.       DataClassesDataContext context = new DataClassesDataContext();  

6.       //serialize and deserialize the entity to detach it from the  

7.       //old data context. This is not part of .NET, I am calling  

8.       //my own code here  

9.       toSave = EntityDetacher.Detach(toSave);  

10.   //is the entity new or just updated?  

11.   //ID is the customer table's identity column, so new entities should  

12.   //have an ID == 0  

13.   if (toSave.ID == 0)  

14.   {  

15.   //insert entity into Customers table  

16.   context.Customers.InsertOnSubmit(toSave);  

17.   }  

18.   else 

19.   {  

20.   //attach entity to Customers table and mark it as "changed"  

21.   context.Customers.Attach(toSave, true);  

22.   }  

23.   //attach or save all "bill" child entities  

24.   foreach (Bill bill in toSave.Bills)  

25.   {  

26.   if (bill.ID == 0)  

27.   {  

28.   context.Bills.InsertOnSubmit(bill);  

29.   }  

30.   else 

31.    

32.   {  

33.   context.Bills.Attach(bill, true);  

34.   }  

35.   //attach or save all "BillingItem" child entities  

36.   foreach (BillingItem billingitem in bill.BillingItems)  

37.   {  

38.   if (bill.ID == 0)  

39.   {  

40.   context.BillingItems.InsertOnSubmit(billingitem);  

41.   }  

42.   else 

43.   {  

44.   context.BillingItems.Attach(billingitem, true);  

45.   }  

46.   }  

47.   }  

48.   } 

不是很復(fù)雜,但很多打字(譯者注:翻譯不是很難,但要一句句的理解,還要打很多字)。并且這只是支持一個微不足道的database scheme和一個單一的實體類型。.想象一下,如果實現(xiàn)數(shù)據(jù)庫層有幾十個實體類型與幾十個外鍵關(guān)系,在這個數(shù)據(jù)存儲類中,你將要為每一個LINQ實體寫幾十套foreach循環(huán),這不僅是單調(diào)乏味,而且還容易出錯。.當(dāng)你添加新的表,你必須添加幾十foreach循環(huán)。

如何避免這些問題

在相當(dāng)多的在線調(diào)研后,我實現(xiàn)了一個RepositoryBase類,使用他您可以快速實現(xiàn)您的數(shù)據(jù)層,所示為測試通過的例子。 首先,用對象關(guān)系映射器(譯者注:Visual Studio自帶工具)來產(chǎn)生序列化的LINQ實體:在Visual Studio中打開dbml文件,在空白區(qū)域某處左鍵單擊,彈出屬性窗口,設(shè)置“Serialization Mode屬性”為“Unidirectional”。

 

現(xiàn)在您可以繼承RepositoryBase實現(xiàn)您自己的Repository:

view plaincopy to clipboardprint?
1.         
2.       public void Save(Customer toSave)   
3.       {   
4.       //the old data context is no more, we need to create a new one   
5.       DataClassesDataContext context = new DataClassesDataContext();   
6.       //serialize and deserialize the entity to detach it from the   
7.       //old data context. This is not part of .NET, I am calling   
8.       //my own code here   
9.       toSave = EntityDetacher.Detach(toSave);   
10.   //is the entity new or just updated?   
11.   //ID is the customer table's identity column, so new entities should   
12.   //have an ID == 0   
13.   if (toSave.ID == 0)   
14.   {   
15.   //insert entity into Customers table   
16.   context.Customers.InsertOnSubmit(toSave);   
17.   }   
18.   else  
19.   {   
20.   //attach entity to Customers table and mark it as "changed"   
21.   context.Customers.Attach(toSave, true);   
22.   }   
23.   //attach or save all "bill" child entities   
24.   foreach (Bill bill in toSave.Bills)   
25.   {   
26.   if (bill.ID == 0)   
27.   {   
28.   context.Bills.InsertOnSubmit(bill);   
29.   }   
30.   else  
31.     
32.   {   
33.   context.Bills.Attach(bill, true);   
34.   }   
35.   //attach or save all "BillingItem" child entities   
36.   foreach (BillingItem billingitem in bill.BillingItems)   
37.   {   
38.   if (bill.ID == 0)   
39.   {   
40.   context.BillingItems.InsertOnSubmit(billingitem);   
41.   }   
42.   else  
43.   {   
44.   context.BillingItems.Attach(billingitem, true);   
45.   }   
46.   }   
47.   }   
48.   }  

您的每一個實體的類型都照這樣做,你就擁有了一個工作在斷開模式下無縫數(shù)據(jù)層。您繼承Repository的類自動執(zhí)行下列方法:

 

 


作為錦上添花的功能,在應(yīng)用程序調(diào)試的過程中,你還可以通過輸出控制臺看到執(zhí)行對數(shù)據(jù)庫的操作的SQL命令。這多虧了被用于RepositoryBase的SQL調(diào)試輸出的Kris Vandermotten 方便的DebuggerWriter組件(譯者注:外國人就是紳士)!

天下有沒有免費的午餐...

當(dāng)前的加載(Load)操作中,沒有任何顯著的性能損失,但是當(dāng)你調(diào)用Save or Delete方法時候,幕后用到一點反射(reflection)操作。

對于絕大多數(shù)的數(shù)據(jù)訪問層(DAL)需求,在你的應(yīng)用程序當(dāng)中,這可能并沒有顯著的的影響。 但是,如果您正在執(zhí)行大量的更新/插入/刪除操作,特別是大量的包含嵌套的實體,那么您可能需要自己寫代碼替代Repository的Save / Delete方法。.所有Save / Delete方法都是虛方法(virtual),因此您可以輕易重寫(override)他們。

另外請注意, RepositoryBase不支循環(huán)依賴(circular dependencies)的遞遞歸save 或者 delete操作。

結(jié)論

本文將和包括源代碼提供了一個簡單,方便和可擴展的方式實現(xiàn)您的多層LINQ數(shù)據(jù)層CRUD(譯者注:增,刪,改,查)的方法。.它利用斷開模式,并支持保存(saving)和加載(loading)嵌套子實體(child entities).在Save 和Delete(譯者注:原文為Load,可能原作者筆誤)操作時候有一個小小的性能損失,但在性能至關(guān)重要的應(yīng)用中,您可以重寫這些Repositories類的Save和Delete。

對于一切,你安心上路,只需幾行代碼。 

【編輯推薦】

  1. 使用LINQ to XML來查詢XML
  2. SQL連接中加條件查詢的LINQ表達式寫法
  3. .NET開發(fā)工具LINQ框架設(shè)計指南
責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2009-09-15 10:02:44

Linq to SQL

2009-09-09 16:45:29

Linq調(diào)用數(shù)據(jù)訪問服

2009-12-02 10:33:34

LINQ to SQL

2009-09-15 17:07:24

Linq To SQL

2009-09-14 09:46:00

LINQ to SQL

2009-12-23 09:04:41

LINQ通用分頁

2009-09-10 10:09:46

LINQ to SQL

2009-09-14 10:12:11

LINQ to SQL

2009-09-14 13:17:51

LINQ to SQLLINQ to SQL

2009-09-18 15:19:19

LINQ to SQL

2009-09-18 14:07:51

LINQ to SQL

2009-09-07 16:13:14

LINQ to SQL

2009-06-08 09:22:07

數(shù)據(jù)訪問優(yōu)化SQL Server

2011-03-29 09:15:28

通用數(shù)據(jù)訪問層

2009-09-18 14:25:36

LINQ to SQL

2009-09-08 14:45:24

Linq to SQL支持SQL Serve

2009-09-16 10:27:35

LINQ Custom

2009-09-11 12:08:09

Linq to SQL

2009-09-10 11:29:00

LINQ to SQL

2009-09-16 17:33:16

LINQ TO SQL
點贊
收藏

51CTO技術(shù)棧公眾號

悠悠色在线精品| 久久午夜电影| 亚洲国产精品va在看黑人| 啊啊啊一区二区| av在线第一页| 国产成人aaa| 欧美自拍视频在线| 开心激情五月网| 男人的天堂久久| 欧美久久久久久蜜桃| 男女猛烈激情xx00免费视频| 成年午夜在线| 99久久综合色| 91在线网站视频| 日韩av大片在线观看| 98精品视频| 亚洲欧美福利视频| 国产一级二级av| 久久xxx视频| 午夜电影网一区| 只有这里有精品| av影片免费在线观看| av中文字幕一区| 亚洲伊人一本大道中文字幕| 亚洲免费视频二区| 国产精品婷婷| 午夜精品福利在线观看| 久久久久久成人网| 亚洲精品推荐| 亚洲成人黄色在线观看| 天堂av.com| 91九色综合| 91黄视频在线| 国产真实乱子伦| 捆绑调教日本一区二区三区| 亚洲一区二区在线观看视频| 手机成人av在线| 在线免费av电影| 国产欧美日韩不卡免费| 欧美日韩一区二区三区在线视频 | 亚洲一区二区三区午夜| 免费在线毛片| 91麻豆国产福利在线观看| 国产精品视频福利| 超碰免费在线97| 国产乱码精品一区二区三区忘忧草| 国产精品三级在线| 中文区中文字幕免费看| 日本亚洲三级在线| 国产精品日韩欧美综合| 自拍偷拍色综合| 日韩**一区毛片| 国产精品日日做人人爱| 91 中文字幕| 久久国内精品自在自线400部| 国产精品久久久av| 亚洲最大成人在线视频| 激情文学综合丁香| 91香蕉亚洲精品| 国产三级小视频| 国产精品中文欧美| 粉嫩av免费一区二区三区| 成人毛片在线精品国产| 成人国产亚洲欧美成人综合网| 国产精品一区视频网站| 日韩一级片免费| 久久久亚洲午夜电影| 日韩国产在线一区| 蜜芽在线免费观看| 亚洲激情自拍偷拍| 国产av天堂无码一区二区三区| 韩国成人二区| 欧美在线免费观看亚洲| 三上悠亚在线一区二区| 成人精品在线| 亚洲а∨天堂久久精品9966 | 99草在线视频| 成人国产免费视频| 日本公妇乱淫免费视频一区三区| eeuss影院www在线观看| 亚洲三级在线观看| 热99这里只有精品| 亚洲综合av一区二区三区| 欧美一区二区在线免费播放| 中文字幕乱视频| 不卡在线一区二区| 色婷婷综合久久久久| 久久97人妻无码一区二区三区| 亚洲综合欧美| 成人激情视频网| 污污网站在线免费观看| 国产精品萝li| a在线视频观看| 精品久久福利| 亚洲国产天堂久久综合网| 日本一级免费视频| 黑人一区二区| 国产精品偷伦免费视频观看的| 风流少妇一区二区三区91| 国产午夜久久久久| 日韩免费在线观看av| 精品日韩视频| 亚洲国产精品成人va在线观看| 夜夜春很很躁夜夜躁| 国产一区二区中文| 国产精品色午夜在线观看| 成人午夜精品福利免费| 国产精品国产自产拍高清av| 欧洲精品一区二区三区久久| 欧美日韩破处视频| 亚洲免费电影一区| 久久精品波多野结衣| 久久精品99久久久| 欧美日韩一区二区三区免费| 毛片在线导航| 4438x成人网最大色成网站| 精品中文字幕在线播放| 亚洲破处大片| 国产日韩av在线播放| 日本aaa在线观看| 亚洲一区二区三区国产| 免费黄频在线观看| 欧美亚洲高清| 国产精品av电影| 日本加勒比一区| 一个色综合av| 操人视频免费看| 久久电影院7| 国产欧美精品va在线观看| 日韩精品系列| 黑人精品xxx一区| www.男人天堂| 日韩一级欧洲| 国产另类第一区| 免费男女羞羞的视频网站在线观看| 欧美久久久影院| 日日操免费视频| 青青草91视频| 亚洲乱码一区二区三区| 日韩欧美一区二区三区免费观看| 日韩精品中文字幕视频在线| 日韩av黄色片| 99久久99久久综合| 91专区在线观看| 三级精品视频| 欧美在线亚洲一区| 久热av在线| 日本韩国欧美一区| 成人黄色a级片| 日本女优在线视频一区二区| 婷婷亚洲婷婷综合色香五月| av一区在线| 久久久国产精品免费| 国产精品一区二区人人爽| 亚洲视频小说图片| 日本美女久久久| 欧美日韩四区| 久久99精品久久久久久久久久| 精精国产xxxx视频在线播放| 亚洲免费影视第一页| 潘金莲一级淫片aaaaaa播放| 国产精品你懂的在线欣赏| 天堂av在线8| 欧美激情五月| 激情小说综合区| 亚洲综合在线电影| 久久视频在线观看免费| 亚洲老妇色熟女老太| 黄色一区二区三区| 国产高清一区二区三区四区| 韩国成人福利片在线播放| 亚洲爆乳无码精品aaa片蜜桃| 国产亚洲成av人片在线观黄桃| 欧洲美女免费图片一区| 色大18成网站www在线观看| 在线电影院国产精品| 国产一二三四在线| 久久久久综合网| 婷婷激情5月天| 影音先锋久久精品| 亚洲高清视频在线观看| 午夜日韩影院| 日韩美女视频中文字幕| 二区在线播放| 亚洲毛片在线观看| 国产女人18毛片水真多| 欧美日韩一区二区免费在线观看 | 中文字幕人妻熟女人妻a片| 亚洲免费黄色| 一区二区三区四区五区精品| 成功精品影院| 国产女同一区二区| 国产传媒在线| 免费91麻豆精品国产自产在线观看| 亚洲精品喷潮一区二区三区| 欧洲亚洲精品在线| 国产在线免费视频| 欧美国产乱子伦| 国产人妻人伦精品1国产丝袜| 老司机精品视频在线| 久久久性生活视频| 91亚洲自偷观看高清| 久久99精品久久久久久青青日本| 久久久精品区| 国产精品九九久久久久久久| av影院在线| 久久精品免费播放| 黄色软件在线| 日韩精品免费在线播放| 国产富婆一级全黄大片| 欧美性淫爽ww久久久久无| 国产一级中文字幕| 亚洲三级在线播放| 91禁男男在线观看| 久久免费美女视频| 99久久人妻精品免费二区| 国产中文一区二区三区| 亚洲色图 在线视频| 夜夜精品视频| 青草视频在线观看视频| 五月激情久久久| 日韩免费一区二区三区| 亚洲97av| 久久久久一区二区三区| 成人免费直播在线| 99re视频在线| 精品视频一区二区三区| 成人免费网站在线观看| 国产精品久久久久久久久久齐齐| 国产mv久久久| 美脚恋feet久草欧美| 午夜精品三级视频福利| 牛牛精品视频在线| 欧美成人免费全部| 黄色在线观看网站| 色狠狠久久aa北条麻妃| www免费网站在线观看| 国产一区二区动漫| 国产福利小视频在线观看| 亚洲欧洲黄色网| 每日更新在线观看av| 亚洲精品丝袜日韩| 国产三级视频在线看| 亚洲人成人99网站| 福利在线午夜| 中文字幕国产精品久久| 精品久久久久一区二区三区| 亚洲色图在线观看| av在线天堂| 久久夜色精品亚洲噜噜国产mv| 黄色网页在线播放| 久久99国产综合精品女同| 欧美寡妇性猛交xxx免费| 欧美激情女人20p| 天堂av在线网| 国产精品www| 亚洲男人在线| 成人动漫视频在线观看完整版| ady日本映画久久精品一区二区| 国产综合av一区二区三区| 欧美顶级毛片在线播放| 热re99久久精品国产99热| 人人狠狠综合久久亚洲婷婷| 国产精品99久久久久久大便| 欧美日本二区| 欧美黄色免费影院| 麻豆国产精品777777在线| 日本一本在线视频| a在线播放不卡| 日韩丰满少妇无码内射| 亚洲天堂2014| 日韩精品久久久久久久| 色综合久久久久综合体| 亚洲天堂久久久久| 精品国产一区二区三区av性色| 午夜福利一区二区三区| 色yeye香蕉凹凸一区二区av| 手机电影在线观看| 51午夜精品视频| 亚洲三级电影| 精品国产乱码久久久久久久软件 | 26uuu国产一区二区三区| 日本美女xxx| 亚洲国产视频网站| 国产精华7777777| 精品乱码亚洲一区二区不卡| 精品欧美不卡一区二区在线观看 | 国产成人在线电影| www.色天使| 亚洲激情在线播放| 中文人妻av久久人妻18| 精品少妇一区二区三区日产乱码 | 九九热在线免费| 国产成人精品网址| 国产伦理片在线观看| 亚洲女人****多毛耸耸8| 色婷婷av国产精品| 日韩一区二区三区视频| 高清国产福利在线观看| 国模吧一区二区| 午夜不卡一区| 欧美日韩免费高清| 亚洲性视频h| 最新av免费在线观看| 91蝌蚪porny成人天涯| 18岁成人毛片| 欧美日韩亚洲综合在线 | 日韩在线一区视频| 国产女主播一区| 日韩精品久久久久久久| 日韩视频不卡中文| 亚洲成人三级| 国产suv精品一区二区| 免费萌白酱国产一区二区三区| 中国一级大黄大黄大色毛片| 免费在线观看成人| 亚洲AV无码国产成人久久| 亚洲动漫第一页| 国产夫妻性生活视频| 中文字幕综合一区| 免费在线成人激情电影| 蜜桃成人免费视频| 亚洲三级毛片| 欧美久久久久久久久久久| 亚洲精品高清在线观看| 国产又粗又猛又爽又黄91| 亚洲一区二区久久久| 中文在线最新版地址| 国产一区二区在线网站| 韩国自拍一区| 农村末发育av片一区二区| 亚洲欧美一区二区三区孕妇| 亚洲熟妇无码久久精品| 这里只有精品丝袜| 欧美aaaaaa| 亚洲国产婷婷香蕉久久久久久99| 快she精品国产999| 影音先锋制服丝袜| 欧美日免费三级在线| porn亚洲| 成人女保姆的销魂服务| 国产精品久久久久久久久久10秀| 91看片在线免费观看| 国产精品丝袜久久久久久app| 中文在线字幕av| 日韩资源在线观看| 日韩护士脚交太爽了| 99热都是精品| 国产成人高清视频| 日本少妇激情视频| 亚洲精品综合精品自拍| 桃花岛成人影院| 亚洲一区二区三区加勒比| 极品尤物av久久免费看| 久久久91视频| 亚洲国产三级网| 日本精品网站| 日韩视频一二三| 成人av高清在线| 成人免费毛片视频| 日韩中文在线观看| 视频成人永久免费视频| 黄页网站在线观看视频| 国产日韩一级二级三级| 这里只有精品9| 欧美精品999| 性欧美lx╳lx╳| 性刺激的欧美三级视频| 一区二区视频在线看| 无码国产精品高潮久久99| 国产精品电影观看| 无码一区二区三区视频| 亚洲图片综合网| 欧美中文字幕不卡| 色呦呦久久久| 欧洲视频一区二区三区| 国模一区二区三区白浆| 一级aaa毛片| 中文字幕国产日韩| 999久久精品| 天天影视综合色| 亚洲一区二区三区激情| 番号在线播放| 国产精品久久国产三级国电话系列| 欧美专区一区二区三区| 久久国产精品国语对白| 亚洲黄色av女优在线观看| 国产三级一区| 欧美精品自拍视频| 成人欧美一区二区三区白人| 午夜视频免费看| 亚洲影视九九影院在线观看| 六月丁香综合| 国产主播在线观看| 自拍亚洲一区欧美另类| 欧美人妖在线观看| 制服下的诱惑暮生| 欧美性三三影院| 川上优av中文字幕一区二区| 午夜啪啪免费视频|