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

淺析NHibernate一對一映射的延遲加載

開發 后端
筆者由于項目需要,最近對.NET平臺下各ORM框架(LINQ to SQL、Entity Framework V2 & V4、以及NHibernate)進行了功能對比,NHiberante可以說是各框架之中歷史最為悠久,功能最強,也是使用最為復雜的一個。本文將介紹NHibernate一對一映射的延遲加載。

在使用NHibernate的過程中也遇到了許多麻煩,不過也得到了不少體會。例如NH的不足之處,我理想中的ORM框架是怎么樣的,等等這些,以后有機會也可以慢慢和各位進行討論。

不過這篇文章談論的其實只是一個小技巧,一個workaround,而且甚至于這個是由于我對NHibernate不夠了解而造成的。因此,如果您有更好的做法也請不吝指出。這個問題也就是“如何實現NHibernate一對一映射的延遲加載”。

NHibernate一對一映射問題描述

之前對于問題的描述,其實還有很多額外的要求沒有講清楚,而需要“workaround”的現狀,也是這些要求共同形成的。經過嘗試,如果放棄其中任何一個(如把主表ID的生成策略從identity改為native),則可能就會有更直接的做法了。這些條件是:

NHibernate一對一映射

主鍵關聯

主表的ID為自增字段

所有字段NOT NULL。

主表和子表設置級聯刪除

現在的問題,就是在這些條件下,如何實現“獲取主表對象時,并不加載其對應的子表數據”,也就是所謂的“延遲加載”。當然,除了能夠“延遲加載”以外,還必須可以插入,更新和刪除——我也嘗試過使用某些特殊的映射方式,可以實現延遲加載,但是卻無法插入,這自然也無法滿足要求。

為了便于理解和實驗,我在這里也將其“具體化”。首先是Model,User和UserDetail,它們是典型的一對一關系:

  1. public class User  
  2. {  
  3.     public virtual int UserID { get; set; }  
  4.     public virtual string Name { get; set; }  
  5.     public virtual UserDetail Detail { get; set; }  
  6. }  
  7.  
  8. public class UserDetail  
  9. {  
  10.     public virtual int UserID { get; set; }  
  11.     public virtual int Age { get; set; }  
  12.     public virtual User User { get; set; }  

而數據庫方面則是一個User表和一個UserDetail表:

  1. CREATE TABLE [dbo].[User](  
  2.     [UserID] [int] IDENTITY(1,1) NOT NULL,  
  3.     [Name] [nvarchar](50) NOT NULL,  
  4.  CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED   
  5. (  
  6.     [UserID] ASC  
  7. ))  
  8. GO  
  9.  
  10. CREATE TABLE [dbo].[UserDetail](  
  11.     [UserID] [int] NOT NULL,  
  12.     [Age] [int] NOT NULL,  
  13.  CONSTRAINT [PK_UserDetail] PRIMARY KEY CLUSTERED   
  14. (  
  15.     [UserID] ASC  
  16. ))  
  17. GO  
  18.  
  19. ALTER TABLE [dbo].[UserDetail]  WITH CHECK ADD  
  20. CONSTRAINT [FK_UserDetail_User] FOREIGN KEY([UserID])  
  21. REFERENCES [dbo].[User] ([UserID])  
  22. ON DELETE CASCADE  
  23. GO  
  24. ALTER TABLE [dbo].[UserDetail] CHECK CONSTRAINT [FK_UserDetail_User]  
  25. GO 

User表為主表,主鍵為UserID,自增。UserDetail為副表,主鍵為UserID,同時作為外鍵與User表產生關聯。同時,外鍵上設置了級聯刪除,也就是在刪除User表的紀錄時,會自動刪除UserDetail的紀錄。

對于環境的描述就到這里,如果您想要自己實驗的話,可以直接使用這些代碼。值得強調一下的是,有些朋友可能會使用NHibernate自動生成數據表,那么請注意嚴格調整NHibernate的配置,使其與這個環境完全相同。

傳統一對一映射

關于一對一映射是否可以延遲加載的問題,我在互聯網上找了許多資料。有NHibernate的資料,也有沒N的資料。有的資料上說不支持,有的資料卻又說可以實現。不過根據那些說“可以”的資料進行配置,卻還是無法做到延遲加載。而把這個問題發到NHibernate的用戶郵件列表中也沒有得到答復。不管怎么樣,我把普通的配置也發布在這里吧。

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHTest" namespace="NHTest"> 
  3.   <class name="User" table="`User`"> 
  4.     <id name="UserID" type="Int32" column="UserID"> 
  5.       <generator class="identity" /> 
  6.     </id> 
  7.     <one-to-one name="Detail" class="UserDetail" cascade="save-update" lazy="proxy" /> 
  8.     <property name="Name" type="String" /> 
  9.   </class> 
  10.  
  11.   <class name="UserDetail" table="`UserDetail`" lazy="true"> 
  12.     <id name="UserID" type="Int32" column="UserID"> 
  13.       <generator class="foreign"> 
  14.         <param name="property">User</param> 
  15.       </generator> 
  16.     </id> 
  17.     <one-to-one name="User" class="User" constrained="true" /> 
  18.     <property name="Age" type="Int32" /> 
  19.   </class> 
  20. </hibernate-mapping> 

按照某些資料的說法,我們把one-to-one的lazy設為proxy,并且把UserDetail節點的lazy設為true,便可以實現延遲加載。也就是說,在執行以下代碼時,并不會去獲取UserDetail的內容:

var user = session.Get<User>(1);
可是現在,NHibernate告訴我們現在使用的SQL是這樣子的(您也可以使用SQL Profiler進行觀察):

  1. SELECT  
  2.     user0_.UserID as UserID0_1_,  
  3.     user0_.Name as Name0_1_,  
  4.     userdetail1_.UserID as UserID1_0_,  
  5.     userdetail1_.Age as Age1_0_  
  6. FROM  
  7.     [User] user0_  
  8. left outer join  
  9.     [UserDetail] userdetail1_  
  10.         on user0_.UserID=userdetail1_.UserID  
  11. WHERE  
  12.     user0_.UserID=@p0;  
  13. @p0 = 1 

很明顯,它仍然把UserDetail一并獲取出來了。如果您覺得這里哪里錯了,請告訴我。

開始繞彎路

從現在開始,我們就要走“彎路”了。雖然我們無法在一對一映射的情況下實現延遲加載,但是我們可以輕易做到“一對多”映射時,延遲加載“集合”中的子對象。我們這個workaround的關鍵,便是利用了“一對多”情況下的延遲加載,把“一對一”作為“一對多”的特殊情況進行處理。不過這里就需要我們修改User的Model了:

  1. public class User  
  2. {  
  3.     public virtual int UserID { get; set; }  
  4.     public virtual string Name { get; set; }  
  5.  
  6.     private ISet<UserDetail> m_detailLazyProxySet;  
  7.     private ISet<UserDetail> DetailLazyProxySet  
  8.     {  
  9.         get  
  10.         {  
  11.             if (this.m_detailLazyProxySet == null)  
  12.             {  
  13.                 this.m_detailLazyProxySet = new HashedSet<UserDetail>();  
  14.             }  
  15.  
  16.             return this.m_detailLazyProxySet;  
  17.         }  
  18.         set  
  19.         {  
  20.             this.m_detailLazyProxySet = value;  
  21.         }  
  22.     }  
  23.  
  24.     public virtual UserDetail Detail  
  25.     {  
  26.         get  
  27.         {  
  28.             return this.DetailLazyProxySet.Count <= 0 ? null :  
  29.                 this.DetailLazyProxySet.Single();  
  30.         }  
  31.         set  
  32.         {  
  33.             this.DetailLazyProxySet.Clear();  
  34.             this.DetailLazyProxySet.Add(value);  
  35.         }  
  36.     }  

也多虧NHibernate支持對private屬性的讀寫,我們可以把DetailLazyProxySet設為私有屬性,對外部保持“純潔”——但是,很明顯我們還是污染了Model。因此,這無論如何也只是一個workaround。

如果您使用xml進行配置,這自然沒有什么問題。不過我還是喜歡使用Fluent NHibernate,流暢,方便,還可以導出為xml。因此,我們這里提供Fluent NHibernate的代碼,相信您也可以輕易得出它所對應的xml配置內容:

  1. public class UserMap : ClassMap<User> 
  2. {  
  3.     public UserMap()  
  4.     {  
  5.         Id(u => u.UserID).GeneratedBy.Identity();  
  6.         Map(u => u.Name);  
  7.  
  8.         var paramExpr = Expression.Parameter(typeof(User));  
  9.         var propertyExpr = Expression.Property(paramExpr, "DetailLazyProxySet");  
  10.         var castExpr = Expression.Convert(propertyExpr, typeof(IEnumerable<UserDetail>));  
  11.         var lambdaExpr = Expression.Lambda<Func<User, IEnumerable<UserDetail>>>(castExpr, paramExpr);  
  12.         HasMany(lambdaExpr)  
  13.             .LazyLoad()  
  14.             .AsSet()  
  15.             .KeyColumnNames.Add("UserID")  
  16.             .Cascade.All()  
  17.             .Inverse();  
  18.     }  
  19. }  
  20.  
  21. public class UserDetailMap : ClassMap<UserDetail> 
  22. {  
  23.     public UserDetailMap()  
  24.     {  
  25.         Id(d => d.UserID).GeneratedBy.Foreign("User");  
  26.         Map(d => d.Age);  
  27.         HasOne(d => d.User).Constrained();  
  28.     }  

值得一提的是,由于DetailLazyProxySet是私有的,我們必須手動地構造一個Lambda表達式傳遞給HasMany方法。在實際使用過程中,我們應該提供額外的輔助方法(自然是為ClassMap<T>新增一個擴展方法),并配合約定(屬性名 + LazyProxySet)來進行強類型的編碼定義。它可能是這樣的:

HasOneByProxySet(u => u.Detail)...
嗯,就是這么點代碼。

實驗

打開NHibernate的SQL輸出,并編寫如下代碼:

  1. var user = session.Get<User>(1);  
  2. Console.WriteLine("Name: {0}", user.Name);  
  3. Console.WriteLine("Age: {0}", user.Detail.Age); 

輸出如下:

  1. NHibernate:  
  2.     SELECT  
  3.         user0_.UserID as UserID1_0_,  
  4.         user0_.Name as Name1_0_  
  5.     FROM  
  6.         [User] user0_  
  7.     WHERE  
  8.         user0_.UserID=@p0;  
  9.     @p0 = 1 
  10. ===> Name: Jeffrey Zhao  
  11. NHibernate:  
  12.     SELECT  
  13.         detaillazy0_.UserID as UserID1_,  
  14.         detaillazy0_.UserID as UserID0_0_,  
  15.         detaillazy0_.Age as Age0_0_  
  16.     FROM  
  17.         [UserDetail] detaillazy0_  
  18.     WHERE  
  19.         detaillazy0_.UserID=@p0;  
  20.     @p0 = 1 
  21. ===> Age: 25 

請注意兩條輸出(已標紅)的位置,很明顯現在已經實現了延遲加載。那么我們要“饑渴加載(Eager Load)”又當如何?其實也很簡單:

  1. var user = session 
  2.     .CreateCriteria<User>()  
  3.     .SetFetchMode("DetailLazyProxySet", FetchMode.Eager)  
  4.     .Add(Expression.IdEq(8))  
  5.     .UniqueResult<User>();  
  6. Console.WriteLine("===> Name: {0}", user.Name);  
  7. Console.WriteLine("===> Age: {0}", user.Detail.Age); 

同樣,“擴展方法”配合“約定”,我們可以把SetFetchMode這行古怪的代碼改成:

.SetFetchMode(u => u.Detail)...

輸出如下:

  1. NHibernate:  
  2.     SELECT  
  3.         this_.UserID as UserID1_1_,  
  4.         this_.Name as Name1_1_,  
  5.         detaillazy2_.UserID as UserID3_,  
  6.         detaillazy2_.UserID as UserID0_0_,  
  7.         detaillazy2_.Age as Age0_0_  
  8.     FROM  
  9.         [User] this_  
  10.     left outer join  
  11.         [UserDetail] detaillazy2_  
  12.             on this_.UserID=detaillazy2_.UserID  
  13.     WHERE  
  14.         this_.UserID = @p0;  
  15.     @p0 = 8 
  16. ===> Name: Jeffrey Zhao 
  17. ===> Age: 25 

我們的饑渴換來數據庫的級聯,和諧而統一。

NHibernate一對一映射的延遲加載總結

至此,我們成功地實現了“一對一”的延遲加載,但是對NHibernate來說,一切都是個一對多的關系。我們獲得了表面的成功,付出了“Model被污染”的代價。

原文來自趙劼博客園博文《NHibernate中一對一關聯的延遲加載

【編輯推薦】

  1. 微軟發布NHibernate Linq 1.0 RTM以支持開源
  2. .NET ORM框架NHibernate Linq 1.0發布
  3. NHibernate與Ado.Net查詢速度的比較
  4. C#.NET使用NHibernate 1.0 XML映射中容易出錯的地方
  5. 淺談LINQ如何插入刪除和更新數據庫記錄備注
責任編輯:彭凡 來源: 博客園
相關推薦

2012-03-21 11:43:41

JavaHibernate

2009-06-03 16:27:27

Hibernate一對一關系

2009-06-24 15:49:54

Entity Bean一對一映射

2009-06-04 16:14:22

Hibernate一對Hibernate一對Hibernate多對

2009-06-26 10:15:54

面試HR

2009-06-03 16:18:16

Hibernate關系代碼實例

2009-07-21 17:31:39

iBATIS一對多映射

2009-09-23 10:37:50

Hibernate一對

2012-03-13 16:29:54

Between情侶移動應用

2009-12-23 09:31:11

寬帶路由上網故障

2009-09-24 11:41:46

Hibernate延遲

2012-02-08 13:34:08

HibernateJava

2009-09-23 10:57:02

Hibernate一對

2013-10-12 16:41:01

微軟微軟CEO鮑爾默

2009-10-22 18:24:35

數字化教學教育

2015-07-30 13:08:56

英特爾一對一數字化學習

2012-12-14 09:54:31

英特爾數字化學習年會

2009-06-24 15:51:47

Entity Bean一對多映射

2009-09-22 09:55:58

Hibernate實例

2009-06-04 10:34:19

Hibernate一對一對多關系配置
點贊
收藏

51CTO技術棧公眾號

一级全黄裸体片| 伊人狠狠色丁香综合尤物| 欧美精品亚洲精品日韩精品| 亚洲精品456| 欧美无砖专区一中文字| 在线一区亚洲| 手机在线不卡av| 日韩专区欧美专区| 欧美高清激情视频| caopeng视频| 日本精品在线播放| 日本道色综合久久| 九九久久九九久久| 日本天堂在线| 韩国三级电影一区二区| 欧美性受xxxx黑人猛交| fc2ppv在线播放| 色愁久久久久久| 69久久99精品久久久久婷婷| 欧美激情国产精品日韩| 成人影院在线观看| 国产日产欧产精品推荐色| 亚洲综合大片69999| 99久久久无码国产精品免费蜜柚| 欧美二区视频| 在线观看国产成人av片| 亚洲成年人av| 99热这里有精品| 日本高清不卡aⅴ免费网站| 久久久久久久香蕉| 欧美精品日韩少妇| 久久久精品免费观看| 91久久精品视频| 在线观看免费视频一区| 免费在线播放第一区高清av| 欧美激情videos| 麻豆天美蜜桃91| 国产一区二区三区网| 亚洲国产高潮在线观看| 中文字幕一区二区三区四| 日韩另类视频| 欧美性猛交xxxx黑人| 69sex久久精品国产麻豆| 成人免费网站在线观看视频| 国产精品国产a级| 日日夜夜精品网站| 激情福利在线| 国产亚洲精品bt天堂精选| 久久久一本精品99久久精品| 全国男人的天堂网| 懂色av一区二区在线播放| 成人激情免费在线| 亚洲天堂免费av| 美女爽到高潮91| 国产精自产拍久久久久久| 日韩电影在线观看一区二区| 免费在线成人| 国产成人亚洲综合青青| 国产精品久久久久久久久夜色| 国产精品入口66mio| 午夜精品一区二区三区在线| 精品国产伦一区二区三区观看体验 | 欧美性xxxxx极品娇小| 免费网站在线观看视频| 宅男在线观看免费高清网站 | 久久精品一级片| 欧美日韩亚洲一区在线观看| 久久男人的天堂| 日本少妇性生活| 91久久视频| 奇米一区二区三区四区久久| 国产精品无码一区| 久久精品二区亚洲w码| 国产欧美中文字幕| 国产91视频在线| 国产91丝袜在线观看| 国产精品99久久久久久久 | 国产日本久久| 制服丝袜中文字幕一区| 在线播放av网址| 欧美美女啪啪| 综合网中文字幕| 久久r这里只有精品| 亚洲精品美女91| 国产精品日韩精品| 午夜精品久久久久久久91蜜桃| 国产99久久久精品| 久久亚洲午夜电影| 久热国产在线| 欧美日韩色婷婷| 浓精h攵女乱爱av| 日韩中文字幕无砖| 精品亚洲一区二区三区在线播放 | 国产国产精品人在线视| 91精品国产色综合久久不8| 国产麻豆精品theporn| 国产一区二区三区av在线| 男人av在线| 一区二区三区高清在线| 国产精品动漫网站| 亚洲福利影视| 日韩av中文字幕在线免费观看| 亚洲欧美va天堂人熟伦| 欧美亚洲不卡| 国产精品精品视频一区二区三区| www.亚洲欧美| 中文字幕乱码亚洲精品一区| 老子影院午夜伦不卡大全| 欧美日韩女优| 日韩h在线观看| 中文字幕在线2021| 日韩高清不卡在线| 国产精品久久九九| 久草中文在线观看| 一本久久a久久免费精品不卡| 亚洲第一天堂久久| 国产精品一在线观看| 久久久久久亚洲精品不卡| 国产成人精品一区二区色戒| av网站一区二区三区| 妞干网这里只有精品| 性欧美freehd18| 日韩av在线免费播放| 欧美三级 欧美一级| 麻豆精品视频在线观看视频| 久久一区二区三区av| 国产经典三级在线| 91精品欧美久久久久久动漫 | 男人午夜视频在线观看| 国产a久久精品一区二区三区 | 亚洲综合久久网| 国产999精品久久久久久| 一区中文字幕在线观看| 亚洲mmav| 国产亚洲在线播放| jizz国产在线观看| 91亚洲精品乱码久久久久久蜜桃| 国产乱子伦精品无码专区| 豆花视频一区| 久久精品一偷一偷国产| 中文字幕视频免费观看| 国产欧美精品一区二区三区四区 | 亚洲美女av在线播放| 豆国产97在线 | 亚洲| 国产精品香蕉一区二区三区| 国产精品jizz在线观看老狼| 日韩免费在线电影| 色七七影院综合| 亚洲天堂久久久久| 中文字幕一区二区视频| 男生操女生视频在线观看| 日韩在线第七页| 国产欧美在线看| 欧美激情办公室videoshd| 精品视频1区2区| 天天操天天摸天天舔| 久久99精品国产.久久久久| 亚洲aⅴ天堂av在线电影软件| 日韩国产网站| 精品国内亚洲在观看18黄 | 精品成人久久久| 99精品国产91久久久久久| 国产日韩一区二区在线| 精品产国自在拍| 欧美壮男野外gaytube| 日本大臀精品| 欧美性大战久久| 天堂av免费在线| 国产乱码精品一区二区三区av| 国产91视频一区| 好吊妞视频这里有精品 | 成人午夜毛片| 久久人人爽人人爽人人片亚洲| www.国产三级| 污片在线观看一区二区| 天天躁日日躁aaaa视频| 久久精品国产久精国产爱| 糖心vlog在线免费观看| 老司机在线精品视频| 国产精品99免视看9| 免费在线看a| 亚洲精品在线免费播放| 黄色在线视频网址| 国产精品久久久久久户外露出| 制服下的诱惑暮生| 在线亚洲观看| 亚洲人成网站在线观看播放| 亚洲精品午夜| 国产精品久久久久久久久久东京| a级片国产精品自在拍在线播放| 亚洲国产精品高清久久久| 91丝袜一区二区三区| 中文字幕日韩一区| 男女一区二区三区| 美女精品自拍一二三四| 男人c女人视频| 深爱激情综合网| 91中文字精品一区二区| gay欧美网站| 久久亚洲国产精品| 欧美日韩国产综合视频| 日韩欧美综合在线| 亚洲中文字幕无码爆乳av| 一区二区三区蜜桃网| 精品国产av无码| 高清国产一区二区| 国产aaaaa毛片| 国产欧美精品久久| 好色先生视频污| 欧美三级伦理在线| 国产一区免费在线| 国产视频一区二| 国产精品九九久久久久久久| caoporn视频在线| 不卡av日日日| 成人在线播放视频| 日韩电视剧免费观看网站| 99热这里只有精品3| 欧美日免费三级在线| 国产精品500部| 一区二区三区欧美在线观看| 超碰97av在线| 久久婷婷久久一区二区三区| 国产国语老龄妇女a片| 久久99在线观看| 午夜免费一区二区| 亚洲欧美日韩视频二区| 黄色一级视频在线播放| 欧美91大片| 欧美性受xxxx黑人猛交88| 欧美日韩色图| 日日夜夜精品网站| 国产精品入口久久| 久久综合久久久| 日韩手机在线| 精品视频免费观看| 精品按摩偷拍| 精品视频一区二区三区四区| 成人免费直播在线| y111111国产精品久久婷婷| 精品三级久久久| 91在线视频九色| 国产精一区二区| 91精品视频在线| 成人亚洲精品| 69174成人网| 亚洲精品在线播放| 91亚洲精品视频| 日本少妇精品亚洲第一区| 亚洲在线免费视频| 欧美电影在线观看一区| 99re6在线| 9999久久久久| 精品综合在线| 免费一区二区三区视频导航| 日本不卡免费新一二三区| 美女亚洲一区| 五月婷婷一区| 亚洲激情中文| 国产成人在线小视频| 91久久视频| aaa毛片在线观看| 日本一不卡视频| 午夜精品中文字幕| 国产精品一区二区在线看| 成熟妇人a片免费看网站| 成人精品视频一区二区三区 | 国产小视频精品| 国产一区二区三区免费看 | 久久精品一区二区三区不卡 | 无码人妻一区二区三区在线视频| 国产成人在线视频网站| 在线免费看黄色片| 久久网这里都是精品| 国产三级精品三级观看| 亚洲一区二区五区| 韩国av中文字幕| 欧美日韩一区精品| www.久久伊人| 亚洲精品一区二区在线| 欧美三级理伦电影| 欧美激情综合亚洲一二区| 亚洲精品永久免费视频| 国产美女久久精品| 成功精品影院| 午夜精品短视频| 精品96久久久久久中文字幕无| 成人羞羞国产免费网站| 国产在线一区二区| 欧美bbbbb性bbbbb视频| 国产精品久久午夜| 国产无码精品在线观看| 欧美性受xxxx| 亚洲欧美另类一区| 在线成人免费网站| heyzo在线| 成人久久久久久久| 台湾色综合娱乐中文网| 特级毛片在线免费观看| 国产欧美日韩综合一区在线播放| 色婷婷综合网站| 97久久精品人人做人人爽50路| 5566中文字幕| 色哟哟精品一区| 肥臀熟女一区二区三区| 伊人男人综合视频网| 91福利在线尤物| 成人欧美一区二区三区黑人孕妇| 五月综合久久| 轻点好疼好大好爽视频| 久草精品在线观看| 午夜理伦三级做爰电影| 亚洲无人区一区| 91丨porny丨在线中文| 亚洲欧美国产日韩中文字幕| 欧美人与性动交α欧美精品图片| 国产精品羞羞答答| 欧美三级午夜理伦三级小说| 久久久久久久久久伊人| 美女尤物国产一区| 国产又大又粗又爽的毛片| 欧美日韩裸体免费视频| 日批视频免费播放| 美日韩精品免费视频| 激情中国色综合| 日产国产精品精品a∨| 校园春色综合网| xxxxxx黄色| 亚洲一区二区三区四区五区黄| 国产精品久久综合青草亚洲AV| 国产一区二区三区毛片| 成人爱爱网址| 麻豆av一区二区| 国产一区二区精品| 国产伦精品一区三区精东| 亚洲激情男女视频| 99久久免费国产精精品| 日韩视频免费在线| 国产精品美女午夜爽爽| 日韩国产精品一区二区| 丝袜脚交一区二区| 亚洲区自拍偷拍| 色8久久精品久久久久久蜜| 四虎精品在线| 欧美中文在线观看国产| 先锋影音国产精品| 日本精品一区在线观看| 91视频免费播放| 久久久久99精品成人片三人毛片| 亚洲国产精品va在线看黑人动漫| av男人的天堂在线观看| 精品国产一区二区三区四区vr| 99综合精品| 丰满圆润老女人hd| 在线观看亚洲一区| 日本激情视频在线观看| 91亚洲国产精品| 国产精品99免费看| 99久久人妻无码中文字幕系列| 欧美色另类天堂2015| 成人影视在线播放| 国产日韩在线播放| 欧美久久成人| 国产精品久久久久久亚洲色| 黄色精品一区二区| 国产在线高清| 国产人妖伪娘一区91| 欧美日韩成人| 黄色录像a级片| 欧美伊人久久久久久午夜久久久久| 18视频免费网址在线观看| 91久久在线视频| 尤物精品在线| 日本一级免费视频| 欧美二区在线观看| 后进极品白嫩翘臀在线播放| 久久大香伊蕉在人线观看热2| 久久综合九色| 欧美视频www| 亚洲精品久久久久中文字幕欢迎你 | 天堂网av在线播放| 国产精品美女午夜av| 欧美fxxxxxx另类| 色婷婷av777| 日韩三级电影网址| 婷婷综合六月| 女女百合国产免费网站| 91在线你懂得| 国产乱子伦精品无码码专区| 97超碰蝌蚪网人人做人人爽| 日韩欧美伦理| 国产乱了高清露脸对白| 欧美日韩高清一区二区三区| 成全电影大全在线观看| 亚洲bbw性色大片| 99久久er热在这里只有精品15| 亚洲天堂avav| 欧美在线视频在线播放完整版免费观看| 欧美aaaa视频| 国产伦精品一区二区三区妓女|