日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【AaronYang风格】第一篇 CodeFirst 初恋

發(fā)布時(shí)間:2025/3/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【AaronYang风格】第一篇 CodeFirst 初恋 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

???????? 原著:Prorgamming Entity Framework Entitywork Code First

???????? 大家好!

???????? 我是AaronYang,這本書我也挺喜歡的,看了一半了,今晚也沒事情,就分享一下一點(diǎn)東西吧

???????? 這本書總共8章,192頁,整體內(nèi)容看起來也不算吃力的。但是自己認(rèn)真學(xué)的,感覺內(nèi)容也不多。初學(xué)者完全不用害怕自己會(huì)不會(huì)學(xué)會(huì),放心吧,會(huì)學(xué)會(huì)的。

???????? 雖然本書還是基于vs2010 開發(fā)的,但是我相信學(xué)會(huì)這個(gè)vs2012那個(gè)也會(huì)很簡單,再說2010現(xiàn)在也還是主流(但也會(huì)對比vs2012的)。當(dāng)然EF會(huì)采用版本EF5的

??????? 內(nèi)容:Code First介紹,幾種EF編程方式的對比,基本DEMO,Code First生成的數(shù)據(jù)庫在哪,NuGet在EF中的使用,Migration的問題,其他錯(cuò)誤處理,Code First 的簡單Convention,配置示例等等,包學(xué)會(huì)的,親!!!

???????? 讀者約定:

????????? Code First單詞太長了,我簡稱 CF ,以后 我一直都會(huì)這樣說哈,不是 騰訊的那個(gè)哈。



第一章 歡迎 Code First

?

微軟的ADO.NET EntityFramework,簡稱就是大家所說的EF,一個(gè)ORM框架。我對ORM的理解就是,按它的語法簡化數(shù)據(jù)庫的操作,平時(shí)都是寫SQL什么的,ORM還有很多,例如NHibernate,Subsonic其他的等等,這里我不想討論這個(gè)

?

在Code First出現(xiàn)之前的Model

EF第一次是在VS2008? .NET3.5中 被引進(jìn)來的。當(dāng)時(shí)工程師們可以用它反向地將數(shù)據(jù)庫變成一個(gè)EDMX后綴名的一個(gè)實(shí)際上是一個(gè)XML的文件。它是可視化的,你可以再次調(diào)整你的model去作為你的Domain(三層的朋友的大多都是DAL,其實(shí)有的架構(gòu)模式,其中的Domain類似于三層中的DAL層)。Visual Studio 2010 .NET4 又引進(jìn)來了 EF的第二個(gè)版本,你們說的EF4(跟.NET版本一樣,都是4,同樣地,

.NET5,現(xiàn)在已經(jīng)有EF5了,那么是不是應(yīng)該學(xué)新的呢,我不清楚,如果有技術(shù)潔癖的朋友,自己調(diào)整一下),在動(dòng)態(tài)創(chuàng)建模型(modeling)的 那一邊,一個(gè)新的叫Model First的編程方式被添加進(jìn)來了。從那以后,你就可以通過可視化界面(edmx文件雙擊后在vs2010里面會(huì)有界面,就是那個(gè)),你可以在那里面設(shè)計(jì)(字段,關(guān)系等等),然后可以基于你設(shè)計(jì)的model重新生成數(shù)據(jù)庫(database)

Model First讓開發(fā)者,首先設(shè)計(jì)模型,在進(jìn)程中創(chuàng)建數(shù)據(jù)庫,也就是動(dòng)態(tài)創(chuàng)建數(shù)據(jù)庫啦。這樣子,你項(xiàng)目運(yùn)行的時(shí)候,使用者,沒有數(shù)據(jù)庫也能動(dòng)態(tài)創(chuàng)建。

不管你是否通過database-first還是model-first的方式設(shè)計(jì)了EDMX,這接下來的一步就是讓你的domain層 里面,通過這些model中的實(shí)體和關(guān)系自動(dòng)地創(chuàng)建類,生成代碼,到這里開始,開發(fā)者就有強(qiáng)類型的類去表現(xiàn)他們的domain中的對象了。有了他們,你就可以很輕松的去操作數(shù)據(jù)庫了。

還好在.NET4 中,EF有了另一個(gè)轉(zhuǎn)變。以前在NET 3.5中,EF管理內(nèi)存中的對象,它必須要讓類繼承Entity Framework的EntityObject對象。EntityObject把對象(誰繼承EntityObject的類)的變化傳遞給Entity Framework,從而也就是變成了 跟蹤這些 對象的變化,最后將這些變化持久化到數(shù)據(jù)庫中去。在.NET4中,除了這個(gè)以外,還有個(gè)POCO(Plain Old CLR Object)支持,它可以讓EntityFramework跟蹤些簡單的類,而不需要使用EntityObject。這樣可以讓開發(fā)者們使用他們自己的類,而不依賴于EntityFramework的了。因?yàn)镋F 運(yùn)行時(shí)候在內(nèi)存中會(huì)用另一個(gè)自己的方式去跟蹤和維護(hù) 對象的狀態(tài)。

?

?

Code First 到來

在EF4的基礎(chǔ)上,微軟再一次地提供了一種方式去建模(modeling),而且現(xiàn)在已經(jīng)有很多開發(fā)者在使用了----Code First.

Code First允許你 不再使用基于XML的EDMX文件去定義你的domain model

即使Model First和Database First可以讓一些開發(fā)者使用他們(技術(shù)工具)生成的代碼去解決處理問題,但是許多開發(fā)者既不想簡單地使用設(shè)計(jì)器去處理問題,也不想使用它們生成的類去處理問題,那些人就是想去寫代碼去解決問題。哎~~

所以Code First可以滿足那些人

在Code First中,你可以通過使用POCO類開始定義你的domain model,這些類都不依賴于Entity Framework的。Code First可以完全根據(jù)你定義的類的結(jié)構(gòu)去推算出一些信息。你也可以進(jìn)一步地提供一些額外的配置去描述你的model或者重寫CF推斷的依據(jù)的東西。這些配置也是通過code(寫代碼)配置的,不是XML文件或者設(shè)計(jì)器。

???????? AaronYang 提醒

???????? 當(dāng)你在使用designer(以前的EF有EDMX文件,雙擊是一個(gè)設(shè)計(jì)器,designer)的時(shí)候,EF4已經(jīng)支持POCO類了。EF團(tuán)隊(duì)提供了 可以幫你生成POCO風(fēng)格類代碼的 POCO模版。這些類在你在設(shè)計(jì)器里面操作,做改變的時(shí)候,這些生成的類也會(huì)自動(dòng)更新。你可能使用自己POCO類而不是使用工具幫你生成的類。但是如果你這樣做的話,你必須保持類與EDMX同步。這就意味著,設(shè)計(jì)器改了,你的類你就要手動(dòng)去改。Code First有個(gè)好處,你的類就是Model了,不需要設(shè)計(jì)器了,這就意味著,你要做改變什么的,你只要改一處,就是改你的 POCO類。

Code First,Database First和Model First都只是生成一些 符合Entity Framework去操作數(shù)據(jù) 特定規(guī)范的類的技術(shù)實(shí)現(xiàn)方式。一旦有了符合EF的

Model,EF不管你采用什么方式,哪一種技術(shù),運(yùn)行的時(shí)候表現(xiàn)的都是一樣的。所以不管選擇哪一種都是取決于你自己。下面一張圖1-1,簡單地說明了一些EntityFramework的細(xì)節(jié)

Code First在.NET4的時(shí)候,沒有立刻發(fā)布,但是也沒有在.NET5的時(shí)候帶給開發(fā)者,在2011年4月,微軟在發(fā)行EntityFramework4.1的時(shí)候,順帶把Code First一部分帶給開發(fā)者了,當(dāng)時(shí)還沒有把Code First的核心部分發(fā)布。接下來,2011年10月 EntityFramework4.2發(fā)布了,替代了EF4.1,才真正包含了Code First。這時(shí)候,Entity Framework API的核心,System.Data.Entity.dll,已經(jīng)作為.NET Framework中的一部分。這個(gè)dll在EF4.1和4.2是一樣,沒有變化。

Entity Framework4.1也包括了另一個(gè)很重要的特征(feature),叫做 DbContext API?????

DbContext是這個(gè)API的核心,當(dāng)然核心還包括了其他的類。DbContext是Entity Framework中ObjectContext的輕量級(jí)版本。換句話說,ObjectContext是DbContext的超集,它包括了微軟覺得開發(fā)者在使用EF時(shí)候經(jīng)常使用的一些特征

DbContext可以讓你用更簡潔的方式,而不需要使用復(fù)雜的ObjectContext的編碼語法,寫更少的代碼去實(shí)現(xiàn)很多通用的相同的功能。當(dāng)使用Code First的時(shí)候,這一切更容易發(fā)現(xiàn),通過這個(gè)系列的博客,你會(huì)慢慢體會(huì)到的。

還有本書叫??? Programming Entity Framework: DbContext?? 在講解DbContext,DbSet,驗(yàn)證API,還有一些其他的DbContext特點(diǎn)的內(nèi)容的時(shí)候,會(huì)講的更深點(diǎn)。

通過這幅圖,發(fā)現(xiàn)Code First,DbContext是建立在EF4前提上的

?

開始寫 Code First

Code First名字取的很巧妙哈,先寫代碼,再寫其他的。我們先不考慮一些你可能需要用到的場景,我們先大致看下基本功能。這本書剩下的內(nèi)容都會(huì)一直講這個(gè)。

???????? AaronYang 說明

???????? 在第一章里面,我們不需要示例代碼。接下來寫的一些代碼只是簡單的例子,不是貫穿全文的示例。從第二章開始,你將會(huì)實(shí)戰(zhàn)練習(xí)。你可以用visual Studio 跟著寫練習(xí),你也可以嘗試不看代碼,自己寫一下。

當(dāng)然了,第一件事情,我們需要寫一些類去描述我們的 商業(yè)領(lǐng)域(domain)。這個(gè)例子比較小,就是個(gè) Patient 和 看獸醫(yī)的Visit 訪問記錄

我們新建一個(gè)控制臺(tái)程序吧

添加一個(gè)類Patient.cs,代碼如下

using System; using System.Collections.Generic; ? namespace ChapterOneProject { public class Patient { public Patient() { Visits = new List<Visit>(); } public int Id { get; set; } public string Name { get; set; } public DateTime BirthDate { get; set; } public AnimalType AnimalType { get; set; } public DateTime FirstVisit { get; set; } public List<Visit> Visits { get; set; } } ? public class Visit { public int Id { get; set; } public DateTime Date { get; set; } public String ReasonForVisit { get; set; } public String Outcome { get; set; } public Decimal Weight { get; set; } public int PatientId { get; set; } } ? public class AnimalType { public int Id { get; set; } public string TypeName { get; set; } } }

?

Code First核心原則----定義一個(gè) 讓Code First基于你的類去生成模型的規(guī)則。比如說,EF要求一個(gè)類要有一個(gè)key屬性(主鍵)。CF就會(huì)用一個(gè)規(guī)則,比如說屬性名是否叫 Id,或者組合起來的Id(比如說 PatientId),像這類屬性的名字都會(huì)自動(dòng)地被CF理解為Key。如果按照規(guī)則找不到這樣的屬性,它會(huì)在運(yùn)行的時(shí)候拋出一個(gè)異常,說沒有key。其他一些的轉(zhuǎn)換規(guī)則(convention),決定了string類型的默認(rèn)長度,或者當(dāng)你的類繼承了其他的類,也就是子類沒有東西,CF會(huì)按照約定給予默認(rèn)的表結(jié)構(gòu),CF根據(jù)EF可以預(yù)測出來的。

如果CF僅僅依賴這點(diǎn)規(guī)則去處理你的類,肯定是有限制的。但是CF沒有強(qiáng)加要求去怎么設(shè)計(jì)去滿足它的處理規(guī)則。反過來想想,這些規(guī)則已經(jīng)可以處理一批常見的場合問題了。如果你的類整合遵循這些規(guī)則,CF就不需要你再提供其他的配置了。EF將會(huì)直接處理你的類。如果你的類沒有遵循約定,你就需要提供其他的配置來保證CF可以正確的理解你的設(shè)計(jì)。

在這3個(gè)類中,Id根據(jù)約定,都會(huì)是主鍵(key).我們先不添加其他配置,讓CF處理這些類。

?

?

用DbContext管理Object

?

上面的這3個(gè)類對Entity Framework來說沒有用,它不認(rèn)識(shí)他們.

但是使用CF就可以了.你就可以使用你自己的類了.如果你使用其他項(xiàng)目的domain層的類,也就是自己的類了,CF將會(huì)非常有用了.

為了使用CF,你必須先定義一個(gè)類,它是要繼承DbContext的.這個(gè)是這些類的角色之一,它會(huì)作為一個(gè)context(上下文),有了它,CF就知道怎樣去構(gòu)造你的model了。同樣地,EF也是會(huì)理解的,從而跟蹤它們的狀態(tài)。這些完成都是靠一個(gè)新的類 DbSet。DbSet跟DbContext出生意義差不多。DbContext被包括在ObjectContext中,輕量級(jí)的。同樣的,DbSet被包括在EF4的ObjectSet中,輕量級(jí)的,使用DbSet可以寫更少的代碼完成一樣的任務(wù)。

下面的代碼展示了context的大致樣子。里面有DbSet泛型的Patients和Visits,但是沒有AnimalTypes。CF足夠的智能,它知道Patient會(huì)使用到AnimalType類,因此,它也是被包括在這個(gè)model中的。通過定義了DbSet,就可以很方便的查詢數(shù)據(jù)了。

使用NuGet添加對 EntityFramework.dll的引用

或者通過這種方式添加對EntityFramework.dll的引用

輸入 Install-Package EntityFramework??? 然后 回車(下面一節(jié)續(xù)篇? 我們稍微講下這個(gè)控制臺(tái)的使用)

?

?

代碼如下

using System.Data.Entity; ? namespace ChapterOneProject { public class VetContext : DbContext { public DbSet<Patient> Patients { get; set; } public DbSet<Visit> Visits { get; set; } } }

接下來,我們完全可以利用CF代碼去操作了,它現(xiàn)在已經(jīng)可以作為我們的數(shù)據(jù)訪問層了,是不是有點(diǎn)吃驚。這里沒有數(shù)據(jù)庫連接字符串,甚至不存在數(shù)據(jù)庫。但是數(shù)據(jù)訪問層已經(jīng)準(zhǔn)備好了,你已經(jīng)可以使用了。

打開Program.cs我們添加如下代碼:

using System; using System.Collections.Generic; using System.Linq; using System.Text; ? namespace ChapterOneProject { class Program { static void Main(string[] args) { var dog = new AnimalType { TypeName = "Dog" }; var patient = new Patient { Name = "Sampson", BirthDate = new DateTime(2008, 1, 28), AnimalType = dog, FirstVisit = new DateTime(2008, 1, 28), Visits = new List<Visit> { new Visit { Date = new DateTime(2011, 9, 1) } } }; ? using (var context = new VetContext()) { context.Patients.Add(patient); context.SaveChanges(); } Console.WriteLine("錄入成功!"); Console.ReadKey(); } } }

創(chuàng)建一個(gè)動(dòng)物類型,狗

然后創(chuàng)建一個(gè)病的狗,來看獸醫(yī)是在2011年9月1日,就一次記錄,還有其他關(guān)于狗的信息

接下來我們是CF語法把這條狗的病情和記錄存到數(shù)據(jù)庫中去

運(yùn)行項(xiàng)目!!

?

?


?

?

數(shù)據(jù)庫生成的位置

?

?

只要你的電腦裝了 VS2012(不在乎你的電腦是否裝了vs2010),默認(rèn)CodeFirst配置生成數(shù)據(jù)庫位置都會(huì)在localdb

VS2012還有種方式查看數(shù)據(jù)庫SQL Server對象資源管理器

如果你的電腦只裝了VS2010,如果你裝了SQLExpress默認(rèn)在 SQLExpress上

EF CodeFirst會(huì)根據(jù)你使用VS2010開發(fā)還是VS2012開發(fā)

會(huì)生成稍微不同的配置文件

我現(xiàn)在的電腦上裝的是VS2010和2012都有,生成的App.config如下

上面基本一樣的

注意下面的entityFramework那個(gè)節(jié)點(diǎn)

這里默認(rèn)的是LocalDbConnectionFactory.EntityFramework,所以這個(gè)項(xiàng)目默認(rèn)生成的數(shù)據(jù)庫在LocalDb上

?

?

如果想生成在最常見的那種SQLServer上,你可以entityFramework節(jié)點(diǎn)下的內(nèi)容改下

?

方式一:

親,你現(xiàn)在還陌生嗎?同樣的不想使用sqlexpress,你自己換成其他的數(shù)據(jù)庫連接字符串方式就行了

?

方式二:

加一個(gè)ConnectionStrings的節(jié)點(diǎn)

關(guān)于packages.config配置文件,我畫紅圈的地方不一樣,看你使用的.netframework,vs2012應(yīng)該是net45

?

如果需要SQLExpress 2008 R2的伙伴,可以到這里官網(wǎng) 下載

???????? AaronYang 提醒

???????? Code First中 Convention這個(gè)單詞

Convention 這個(gè)單詞我個(gè)人理解是 規(guī)定,約定。 寫CodeFirst的人,如果你的類符合Convention,CodeFirst就能認(rèn)識(shí),然后它就能夠按照已經(jīng)定義好的Convention去處理你的類,生成你想要的數(shù)據(jù)庫結(jié)構(gòu),然后你就可以利用EntityFramework操作數(shù)據(jù)庫了。比如說Visit類中的PatientId符合Convention,這里自動(dòng)處理成外鍵了。int類型,是其他類的名字+Id

?????????? 再比如說,VetContext中沒有聲明DbSet<AnimalType>但是CodeFirst也會(huì)幫我們生成,它好像什么都知道的樣子原因是你寫的Code符合它的Convention了。還有很多其他的Convention,我們后面幾章講解到的。

????????? 后面的內(nèi)容,我會(huì)經(jīng)常說到Convention,到時(shí)候,我可不解釋咯。如果想要具體添加或者修改Convention,我們可以通過配置完成,當(dāng)然這里肯定不是DatabaseFirst或者M(jìn)odelFirst中的 designer可視化操實(shí)際上XML文件的EDMX文件。具體的后面說吧

?

?


各種方式是如何把Class們變成數(shù)據(jù)庫的,如圖

?

這個(gè)就好比?? 用VC++,VB,C#等.net語言,不管前面怎么弄,最終會(huì)變成中間代碼(IL)才能被機(jī)器識(shí)別

也就是說DataBase First,? Model Fitst,Code First 最終都是變成內(nèi)存中的對象,EntityFramework能夠識(shí)別的(例如EntityType,AssociatonType),然后就可以跟蹤,持久化數(shù)據(jù)操作等等。

?

?

?



簡單的配置了解

Code First主要有兩種,第一種是Data Annotations,? 第二種是Fluent API

第二種的方式的配置更強(qiáng)大點(diǎn),也就是說,DataAnnotations的功能是Fluent API功能的子集,但是DataAnnotations使用起來更簡潔

?

======Data Annotations小例子====

我們應(yīng)該發(fā)現(xiàn)AnimalTypes那張表中,可以為空,我們不希望為空,怎么做?

我們只要在TypeName屬性上加一個(gè)Required

此時(shí)再次 運(yùn)行項(xiàng)目,

會(huì)發(fā)生這個(gè)錯(cuò)誤。因?yàn)槟P透淖兞?#xff0c;建議我使用Code First Migrations去更新數(shù)據(jù)庫。這里講到了Migrations(遷移)

我們先解決這個(gè)問題

我們打開? 包資源管理器控制臺(tái),輸入enable-Migrations?? 大小寫無所謂

運(yùn)行后會(huì)生成一個(gè)文件夾,后面的20130829020525什么的是時(shí)間戳,讓每次的Migration都不會(huì)出現(xiàn)重復(fù)的文件名

如果 你還遇到一個(gè)這樣的問題(我是遇到了):

比如我嘗試重新安裝EntityFramework,因?yàn)槲乙婚_項(xiàng)目在家里的電腦的vs,然后用的公司電腦的vs,兩個(gè)vs的NuGet版本

不一樣,所以會(huì)報(bào)如下的錯(cuò)誤,你只要重新安裝最新版本的NuGet,就是保證兩個(gè)前一次使用的NuGet版本和現(xiàn)在的要一樣就行了

接下來,我們執(zhí)行? add-migration AddRequiredOnAnimalType_TypeName(包管理控制臺(tái)中執(zhí)行)

添加一次遷移

然后我們執(zhí)行update-database

刷新數(shù)據(jù)庫,TypeName變成not null了,說白了每次的update-database命令都是轉(zhuǎn)換成sql去執(zhí)行、在后面 update-database –verbose? 就可以查看這次遷移的sql語句了。

加了Required后就像ASP.NET MVC3中那樣,Model中的屬性就具有驗(yàn)證的功能了,如果為空,EF就會(huì)拋出異常的

?

由于客戶機(jī)器上沒有vs,所以你可以把這段sql拷過去,作為本次版本數(shù)據(jù)庫的改變了

?

我們再在 AnimalType上加上Table注解,里面就是最新的表名稱

我再做一次遷移? 復(fù)習(xí)一下過程

1.??? add-migration UpdateAnimalTypeTableNameToSpecies

2.??? update-database –verbose

?

?

?

======Fluent API小例子====

同樣的過程,我們使用Fluent API操作下

打開VetContext類,重寫OnModelCreating方法,添加一些代碼,估計(jì)一看就能看懂了,這里不細(xì)說了

using System.Data.Entity; ? namespace ChapterOneProject { public class VetContext : DbContext { public DbSet<Patient> Patients { get; set; } public DbSet<Visit> Visits { get; set; } ? protected override void OnModelCreating (DbModelBuilder modelBuilder) { modelBuilder.Entity<AnimalType>() .ToTable("Species"); modelBuilder.Entity<AnimalType>() .Property(p => p.TypeName).IsRequired(); } } }

判斷開發(fā)者使用了那種EF模式,下面有張圖判斷

這里不做具體討論了





最后留言

?

關(guān)于這本書,重點(diǎn)是在講使用Code First構(gòu)建和配置模型(Model).是 Programming Entity Framework (second edition)這本書的拓展。還有一本書叫Programming Entity Framework: DbContext,主要重點(diǎn)在DbContext, DbSet, Validation API,還有些EntityFramework NuGet? 包的一些功能的使用講解

?

?

?

?

代碼下載: 下載

注意,可能我們的NuGet的包不太一樣,所以運(yùn)行時(shí)候可能有錯(cuò)誤,所以代碼僅供參考.如果有疑問,親留言….

?

本文章是 Http://AaronYang.cnblogs.com? AaronYang(楊洋)辛苦寫的,轉(zhuǎn)載時(shí)候,請標(biāo)明出處

總結(jié)

以上是生活随笔為你收集整理的【AaronYang风格】第一篇 CodeFirst 初恋的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男女一进一出视频 | 蜜桃成人免费视频 | 国产91在线精品 | 国产视频精选 | 国产吞精囗交免费视频 | 精品无人国产偷自产在线 | 亚洲美女视频在线观看 | 欧美一区二区三区久久综合 | 国产精品久久久久久久久免费相片 | 日本亚洲色图 | 午夜av一区二区三区 | 国产模特av私拍大尺度 | 波多野结衣三级视频 | 午夜国产在线观看 | 欧美一区二区二区 | 国产日韩欧美在线播放 | 97成人人妻一区二区三区 | 女人下边被添全过视频 | 徐锦江一级淫片免费看 | 亚洲天堂视频网站 | va免费视频 | 我们俩电影网mp4动漫官网 | 亚洲av日韩av高潮潮喷无码 | 人妖天堂狠狠ts人妖天堂狠狠 | 射网站 | 色屁屁一区二区三区视频 | 国产毛片a级| 日韩中文字幕av电影 | 中文字幕精品无码亚 | 亚洲一区二区精品在线观看 | 人妻夜夜爽天天爽三区麻豆av网站 | 国产二区自拍 | 国产精品12页 | 四季av国产一区二区三区 | 国产精品视频久久久久久久 | 国产调教在线 | 国产一二三在线 | 澳门色网 | 久久久久成人精品无码中文字幕 | 尤物国产视频 | 免费黄色av电影 | 色欲人妻综合网 | 日皮视频免费看 | 国产精品视频一区二区三区, | 国产成人无码a区在线观看视频 | jzz在线观看 | 好吊色这里只有精品 | 亚洲深夜福利视频 | 四虎影院永久 | 视频一区欧美 | 国产a级淫片 | www.色日本 | 国产99久久久欧美黑人 | 超碰老司机 | 日本在线有码 | 欧美在线观看一区 | 四虎影视国产精品 | 久久91久久| 国产成人超碰人人澡人人澡 | 黑人巨大精品人妻一区二区 | 九九精品在线视频 | 奇米99| 91尤物视频在线观看 | 久久久久国产精品视频 | 精品少妇一区二区三区在线观看 | 成人国产一区二区三区精品麻豆 | 国产熟妇乱xxxxx大屁股网 | 蜜臀视频一区二区三区 | 日大逼| 香港三日本8a三级少妇三级99 | 超碰www| 日本久热 | 亚洲+小说+欧美+激情+另类 | 免费处女在线破视频 | 强行挺进皇后紧窄湿润小说 | 免费看毛片网站 | 黄视频免费观看 | 成了校长的性脔h文 | av男人天堂av | 中文字幕大全 | 一起草av在线 | 欧美 亚洲 另类 激情 另类 | 淫僧荡尼巨乳(h)小说 | 日本精品成人 | 深爱婷婷网 | 日本视频一区二区 | 欧美18免费视频 | av在线毛片| 风流少妇按摩来高潮 | 亚洲性猛交富婆 | 国产欧美日韩在线观看 | 成人综合婷婷国产精品久久 | 狠狠操五月天 | 亚洲社区在线 | 欧美一区二区免费 | gv天堂gv无码男同在线观看 | 综合成人在线 | 狠狠搞狠狠干 | 国产寡妇色xxⅹ交肉视频 |