日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework

發(fā)布時間:2023/12/4 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

一直以來寫的博文都是比較溫婉型的博文,今天這篇博文算是一篇批判性博文,有問題歡迎探討,如標題,你到底會不會用EntityFramework啊。

你到底會不會用EntityFramework啊

  面試過三年至六年的同行,作為過面試者到如今作為面試官也算是老大對我的信任,對來面試的面試者的任何一位同行絕沒有刁難之意,若還裝逼那就沒有什么意義。我也基本不看面試者的項目經(jīng)歷,因為我個人覺得每個面試者所在公司所做項目都不一樣,可能面試者項目所做的業(yè)務(wù)我一點都不知道,而我所關(guān)心的是項目當中所用到的技術(shù),稍微看下了簡歷讓面試者簡單做個自我介紹,這算是基本流程吧。然后直接問面試者最擅長的技術(shù)是哪些?比如ASP.NET MVC、比如ASP.NET Web APi、比如EntityFramework,再比如數(shù)據(jù)庫等等。如果面試者沒有特別擅長的技術(shù)那我就簡歷上提出所熟悉和項目當中用到的技術(shù)進行提問。這里暫且不提其他技術(shù),單單說EntityFramework,面試的面試者大部分都有用過EntityFramework,我就簡單問了下,比如您用的EntityFramework版本是多少?答案是不知道,這個我理解,可能沒去關(guān)心過這個問題,再比如我問您知道EntityFramework中有哪些繼承策略,然后面試者要么是一臉懵逼,要么是不知道,要么回了句我們不用。這個我也能理解,重點來了,我問您在EntityFramwork中對于批量添加操作是怎么做的,無一例外遍歷循環(huán)一個一個添加到上下文中去,結(jié)果令我驚呆了,或許是只關(guān)注于實現(xiàn),很多開發(fā)者只關(guān)注這個能實現(xiàn)就好了,這里不過多探討這個問題,每個人觀點不一樣。

  大部分人用EntityFramework時出現(xiàn)了問題,就吐槽EntityFramework啥玩意啊,啥ORM框架啊,各種問題,我只能說您根本不會用EntityFramework,甚至還有些人并發(fā)測試EntityFramework的性能,是的,沒錯,EntityFramework性能不咋的(這里我們只討論EF 6.x),或者說在您實際項目當中有了點并發(fā)發(fā)現(xiàn)EF出了問題,又開始抱怨EF不行了,同時對于輕量級、跨平臺、可擴展的EF Core性能秒殺EF,即使你并發(fā)測試EF Core性能也就那么回事,我想說的是你并發(fā)測試EF根本沒有任何意義,請好生理解EF作為ORM框架出現(xiàn)的意義是什么,不就是為了讓我們關(guān)注業(yè)務(wù)么,梳理好業(yè)務(wù)對象,在EF中用上下文操作對象就像直接操作表一樣。然后我們回到EF抵抗并發(fā)的問題,有的童鞋認為EF中給我提供了并發(fā)Token和行版本以及還有事務(wù),這不就是為了并發(fā)么,童鞋對于并發(fā)Token和行版本這是對于少量的請求可能存在的并發(fā)EF團隊提出的基本解決方案,對于事務(wù)無論是同一上文抑或是跨上下文也好只是為了保證數(shù)據(jù)一致性罷了。要是大一點的并發(fā)來了,您難道還讓EF不顧一切沖上去么,這無疑是飛蛾撲火自取滅亡,你到底會不會用EntityFramework啊。EF作為概念上的數(shù)據(jù)訪問層應(yīng)該是處于最底層,如果我們項目可預(yù)見沒有所謂的并發(fā)問題,將上下文直接置于最上層比如控制器中并沒有什么問題,但是項目比較大,隨著用戶量的增加,我們肯定是可預(yù)知的,這個我們需要從項目架構(gòu)層面去考慮,此時在上下文上游必定還有其他比如C#中的并發(fā)隊列或者Redis來進行攔截使其串行進行。

  有些人號稱是對EntityFramwork非常了解,認為不就是增、刪、該、查么,但是有的時候用出了問題就開始自我開解,我這么用沒有任何問題啊,我們都知道在EF 6.x中確實有很多坑,這個時候就借這個緣由洗白了,這不是我的鍋,結(jié)果EF背上了無名之鍋,妄名之冤。是的,您們沒有說錯,EF 6.x是有很多坑,您避開這些坑不就得了,我只能說這些人太浮于表面不了解基本原理就妄下結(jié)論,你到底會不會用EntityFramework啊。好了來,免說我紙上談兵,我來舉兩個具體例子,您們看你到底會不會用。

EntityFramework 6.x查詢

static void Main(string[] args)

? ? ? ? {

? ? ? ? ? ? using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? ctx.Database.Log = Console.WriteLine;


? ? ? ? ? ? ? ? var code = "Jeffcky";

? ? ? ? ? ? ? ? var order = ctx.Orders.FirstOrDefault(d => d.Code == code);? ? ? ? ? ?

? ? ? ? ? ? };

? ? ? ? ? ? Console.ReadKey();

? ? ? ? }

這樣的例子用過EF 6.x的童鞋估計用爛了吧,然后查詢出來的結(jié)果讓我們也非常滿意至少是達到了我們的預(yù)期,我們來看看生成的SQL語句。

?

請問用EF的您們發(fā)現(xiàn)什么沒有,在WHERE查詢條件加上了一堆沒有用的東西,我只是查詢Code等于Jeffcky的實體數(shù)據(jù),從生成的SQL來看可查詢Code等于Jeffcky的也可查詢Code等于空的數(shù)據(jù),要是我們?nèi)缦虏樵?#xff0c;生成如上SQL語句我覺得才是我們所預(yù)期的對不對。

using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? ctx.Database.Log = Console.WriteLine;


? ? ? ? ? ? ? ? var code = "Jeffcky";

? ? ? ? ? ? ? ? var orders = ctx.Orders.Where(d => d.Code == null || d.Code == code).ToList();


? ? ? ? ? ? };

如果您真的會那么一點點用EntityFramework,那么請至少了解背后生成的SQL語句吧,這是其中之一,那要是我們直接使用值查詢呢,您們覺得是否和利用參數(shù)生成的SQL語句是一樣的呢?

using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? ctx.Database.Log = Console.WriteLine;


? ? ? ? ? ? ? ? var order = ctx.Orders.FirstOrDefault(d => d.Code == "Jeffcky");


? ? ? ? ? ? };

出乎意料吧,利用值查詢在WHERE條件上沒有過多的條件過濾,而利用參數(shù)查詢則是生成過多的條件篩選,到這里是不是就到此為止了呢,如果您們對于參數(shù)查詢不想生成對空值的過濾,我們在上下文構(gòu)造函數(shù)中可關(guān)閉這種所謂【語義可空】判斷,如下:

public class EfDbContext : DbContext

? ? {

? ? ? ? public EfDbContext() : base("name=ConnectionString")

? ? ? ? {

? ? ? ? ? ? Configuration.UseDatabaseNullSemantics = true;

? ? ? ? }

? ? ?}

// 摘要:
// 獲取或設(shè)置一個值,該值指示當比較兩個操作數(shù),而它們都可能為 null 時,是否展示數(shù)據(jù)庫 null 語義。默認值為 false。例如:如果 UseDatabaseNullSemantics
// 為 true,則 (operand1 == operand2) 將轉(zhuǎn)換為 (operand1 = operand2);如果 UseDatabaseNullSemantics
// 為 false,則將轉(zhuǎn)換為 (((operand1 = operand2) AND (NOT (operand1 IS NULL OR operand2
// IS NULL))) OR ((operand1 IS NULL) AND (operand2 IS NULL)))。
//
// 返回結(jié)果:
// 如果啟用數(shù)據(jù)庫 null 比較行為,則為 true;否則為 false。

在EF 6.x中對于查詢默認情況下會進行【語義可空】篩選,通過如上分析,不知您們是否知道如上的配置呢。

EntityFramework 6.x更新

EF 6.x更新操作又是用熟透了吧,在EF中沒有Update方法,而在EF Core中存在Update和UpdateRange方法,您們是否覺得更新又是如此之簡單呢?我們下面來首先看一個例子,看看您們是否真的會用。

static Customer GetCustomer()

? ? ? ? {

? ? ? ? ? ? var customer = new Customer()

? ? ? ? ? ? {

? ? ? ? ? ? ? ? Id = 2,

? ? ? ? ? ? ? ? CreatedTime = DateTime.Now,

? ? ? ? ? ? ? ? ModifiedTime = DateTime.Now,

? ? ? ? ? ? ? ? Email = "2752154844@qq.com",

? ? ? ? ? ? ? ? Name = "Jeffcky1"

? ? ? ? ? ? };

? ? ? ? ? ? return customer;

? ? ? ? }

如上實體如我們請求傳到后臺需要修改的實體(假設(shè)該實體在數(shù)據(jù)庫中存在哈),這里我們進行寫死模擬。接下來我們來進行如下查詢,您們思考一下是否能正常更新呢?

using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? var customer = GetCustomer();

? ? ? ? ? ? ? ? var dataBaseCustomer = ctx.Customers.FirstOrDefault(d => d.Id == customer.Id);

? ? ? ? ? ? ? ? if (dataBaseCustomer != null)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ctx.Customers.Attach(customer);

? ? ? ? ? ? ? ? ? ? ctx.Entry(customer).State = EntityState.Modified;

? ? ? ? ? ? ? ? ? ? if (ctx.SaveChanges() > 0)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新成功");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新失敗");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }


? ? ? ? ? ? };

首先我們根據(jù)傳過來的實體主鍵去數(shù)據(jù)庫中查詢是否存在,若存在則將傳過來的實體附加到上下文中(因為此時請求過來的實體還未被跟蹤),然后將其狀態(tài)修改為已被修改,最后提交,解釋的是不是非常合情合理且合法,那是不是就打印更新成功了呢?

看到上述錯誤想必有部分童鞋一下子就明白問題出在哪里,當我們根據(jù)傳過來的實體主鍵去數(shù)據(jù)庫查詢,此時在數(shù)據(jù)庫中存在就已被上下文所跟蹤,然后我們又去附加已傳過來的實體且修改狀態(tài),當然會出錯因為在上下文已存在相同的對象,此時必然會產(chǎn)生已存在主鍵沖突。有的童鞋想了直接將傳過來的實體狀態(tài)修改為已修改不就得了么,如下:

using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? var customer = GetCustomer();

? ? ? ? ? ? ? ? ctx.Entry(customer).State = EntityState.Modified;

? ? ? ? ? ? ? ? if (ctx.SaveChanges() > 0)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新成功");

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新失敗");

? ? ? ? ? ? ? ? }

? ? ? ? ? ? };

如此肯定能更新成功了,我想都不會這么干吧,要是客戶端進行傳過來的主鍵在數(shù)據(jù)庫中不存在呢(至少我們得保證數(shù)據(jù)是已存在才修改),此時進行如上操作將拋出如下異常。

此時為了解決這樣的問題最簡單的方法之一則是在查詢實體是否存在時直接通過AsNoTracking方法使其不能被上下文所跟蹤,這樣就不會出現(xiàn)主鍵沖突的問題。

var dataBaseCustomer = ctx.Customers.AsNoTracking().FirstOrDefault(d => d.Id == customer.Id);

我們繼續(xù)往下探討 ,此時我們將數(shù)據(jù)庫Email修改為可空(映射也要對應(yīng)為可空,否則拋出驗證不通過的異常,你懂的),如下圖:

?

然后將前臺傳過來的實體進行如下修改,不修改Email,我們注釋掉。

static Customer GetCustomer()

? ? ? ? {

? ? ? ? ? ? var customer = new Customer()

? ? ? ? ? ? {

? ? ? ? ? ? ? ? Id = 2,

? ? ? ? ? ? ? ? CreatedTime = DateTime.Now,

? ? ? ? ? ? ? ? ModifiedTime = DateTime.Now,

? ? ? ? ? ? ? ? //Email = "2752154844@qq.com",

? ? ? ? ? ? ? ? Name = "Jeffcky1"

? ? ? ? ? ? };

? ? ? ? ? ? return customer;

? ? ? ? }

我們接著再來進行如下查詢試試看。

using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? var customer = GetCustomer();

? ? ? ? ? ? ? ? var dataBaseCustomer = ctx.Customers

? ? ? ? ? ? ? ? ? ? .AsNoTracking()

? ? ? ? ? ? ? ? ? ? .FirstOrDefault(d => d.Id == customer.Id);

? ? ? ? ? ? ? ? if (dataBaseCustomer != null)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ctx.Customers.Attach(customer);

? ? ? ? ? ? ? ? ? ? ctx.Entry(customer).State = EntityState.Modified;

? ? ? ? ? ? ? ? ? ? if (ctx.SaveChanges() > 0)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新成功");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新失敗");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }


? ? ? ? ? ? };

按 Ctrl+C 復(fù)制代碼

此時Email為可空,因為我們設(shè)置實體狀態(tài)為Modified,此時將對實體進行全盤更新,所以對于設(shè)置實體狀態(tài)為Modified是針對所有列更新,要是我們只想更新指定列,那這個就不好使了,此時我們可通過Entry().Property()...來手動更新指定列,比如如下:

using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? var customer = GetCustomer();

? ? ? ? ? ? ? ? var dataBaseCustomer = ctx.Customers

? ? ? ? ? ? ? ? ? ? .AsNoTracking()

? ? ? ? ? ? ? ? ? ? .FirstOrDefault(d => d.Id == customer.Id);

? ? ? ? ? ? ? ? if (dataBaseCustomer != null)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ctx.Customers.Attach(customer);

? ? ? ? ? ? ? ? ? ? ctx.Entry(customer).Property(p => p.Name).IsModified = true;

? ? ? ? ? ? ? ? ? ? ctx.Entry(customer).Property(p => p.Email).IsModified = true;

? ? ? ? ? ? ? ? ? ? if (ctx.SaveChanges() > 0)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新成功");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新失敗");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }


? ? ? ? ? ? };


我們繼續(xù)往下走。除了上述利用AsNoTracking方法外使其查詢出來的實體未被上下文跟蹤而成功更新,我們還可以使用手動賦值的方式更新數(shù)據(jù),如下:

using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? var customer = GetCustomer();

? ? ? ? ? ? ? ? var dataBaseCustomer = ctx.Customers

? ? ? ? ? ? ? ? ? ? .FirstOrDefault(d => d.Id == customer.Id);

? ? ? ? ? ? ? ? if (dataBaseCustomer != null)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? dataBaseCustomer.CreatedTime = customer.CreatedTime;

? ? ? ? ? ? ? ? ? ? dataBaseCustomer.ModifiedTime = customer.ModifiedTime;

? ? ? ? ? ? ? ? ? ? dataBaseCustomer.Email = customer.Email;

? ? ? ? ? ? ? ? ? ? dataBaseCustomer.Name = customer.Name;

? ? ? ? ? ? ? ? ? ? if (ctx.SaveChanges() > 0)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新成功");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新失敗");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }


? ? ? ? ? ? };

如上也能更新成功而不用將查詢出來的實體未跟蹤,然后將前臺傳過來的實體進行附加以及修改狀態(tài),下面我們刪除數(shù)據(jù)庫中創(chuàng)建時間和修改時間列,此時我們保持數(shù)據(jù)庫中數(shù)據(jù)和從前臺傳過來的數(shù)據(jù)一模一樣,如下:

static Customer GetCustomer()

? ? ? ? {

? ? ? ? ? ? var customer = new Customer()

? ? ? ? ? ? {

? ? ? ? ? ? ? ? Id = 2,

? ? ? ? ? ? ? ? Email = "2752154844@qq.com",

? ? ? ? ? ? ? ? Name = "Jeffcky1"

? ? ? ? ? ? };

? ? ? ? ? ? return customer;

? ? ? ? }

接下來我們再來進行如下賦值修改,你會發(fā)現(xiàn)此時更新失敗的:

using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? var customer = GetCustomer();

? ? ? ? ? ? ? ? var dataBaseCustomer = ctx.Customers

? ? ? ? ? ? ? ? ? ? .FirstOrDefault(d => d.Id == customer.Id);

? ? ? ? ? ? ? ? if (dataBaseCustomer != null)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? dataBaseCustomer.Email = customer.Email;

? ? ? ? ? ? ? ? ? ? dataBaseCustomer.Name = customer.Name;

? ? ? ? ? ? ? ? ? ? if (ctx.SaveChanges() > 0)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新成功");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新失敗");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }


? ? ? ? ? ? };

這是為何呢?因為數(shù)據(jù)庫數(shù)據(jù)和前臺傳過來的數(shù)據(jù)一模一樣,但是不會進行更新,毫無疑問EF這樣處理是明智且正確的,無需多此一舉更新,那我們怎么知道是否有不一樣的數(shù)據(jù)進行更新操作呢,換句話說EF怎樣知道數(shù)據(jù)未發(fā)生改變就不更新呢?我們可以用上下文屬性中的ChangeTacker中的HasChanges方法,如果上下文知道數(shù)據(jù)未發(fā)生改變,那么直接返回成功,如下:

using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? var customer = GetCustomer();

? ? ? ? ? ? ? ? var dataBaseCustomer = ctx.Customers

? ? ? ? ? ? ? ? ? ? .FirstOrDefault(d => d.Id == customer.Id);

? ? ? ? ? ? ? ? if (dataBaseCustomer != null)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? dataBaseCustomer.Email = customer.Email;

? ? ? ? ? ? ? ? ? ? dataBaseCustomer.Name = customer.Name;

? ? ? ? ? ? ? ? ? ? if (!ctx.ChangeTracker.HasChanges())

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新成功");

? ? ? ? ? ? ? ? ? ? ? ? return;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? if (ctx.SaveChanges() > 0)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新成功");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新失敗");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }


? ? ? ? ? ? };

好了到此為止我們已經(jīng)看到關(guān)于更新已經(jīng)有了三種方式,別著急還有最后一種,通過Entry().CurrentValues.SetValues()方式,這種方式也是指定更新,將當前實體的值設(shè)置數(shù)據(jù)庫中查詢出來所被跟蹤的實體的值。如下:

using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? var customer = GetCustomer();

? ? ? ? ? ? ? ? var dataBaseCustomer = ctx.Customers

? ? ? ? ? ? ? ? ? ? .FirstOrDefault(d => d.Id == customer.Id);

? ? ? ? ? ? ? ? if (dataBaseCustomer != null)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ctx.Entry(dataBaseCustomer).CurrentValues.SetValues(customer);

? ? ? ? ? ? ? ? ? ? if (ctx.SaveChanges() > 0)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新成功");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Console.WriteLine("更新失敗");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }


? ? ? ? ? ? };

關(guān)于EF更新方式講了四種,其中有關(guān)細枝末節(jié)就沒有再細說可自行私下測試,不知道用過EF的您們是否四種都知道以及每一種對應(yīng)的場景是怎樣的呢?對于數(shù)據(jù)更新我一般直接通過查詢進行賦值的形式,當然我們也可以用AutoMapper,然后通過HasChanges方法來進行判斷。

EntityFramework 6.x批量添加

對于批量添加已經(jīng)是EF 6.x中老掉牙的話題,但是依然有很多面試者不知道,我這里再重新講解一次,對于那些私下不學(xué)習(xí),不與時俱進的童鞋好歹也看看前輩們(不包括我)總經(jīng)的經(jīng)驗吧,不知道為何這樣做,至少回答答案是對的吧。看到下面的批量添加數(shù)據(jù)代碼是不是有點想打人。

using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? for (var i = 0; i <= 100000; i++)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? var customer = new Customer

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Email = "2752154844@qq.com",

? ? ? ? ? ? ? ? ? ? ? ? Name = i.ToString()

? ? ? ? ? ? ? ? ? ? };

? ? ? ? ? ? ? ? ? ? ctx.Customers.Add(customer);

? ? ? ? ? ? ? ? ? ? ctx.SaveChanges();

? ? ? ? ? ? ? ? }

? ? ? ? ? ? };

至于原因無需我過多解釋,如果您這樣操作,那您這一天的工作大概也就是等著數(shù)據(jù)添加完畢,等啊等。再不濟您也將SaveChanges放在最外層一次性提交啊,這里我就不再測試,浪費時間在這上面沒必要,只要您稍微懂點EF原理至少會如下這么使用。

var customers = new List<Customer>();

? ? ? ? ? ? using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? for (var i = 0; i <= 100000; i++)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? var customer = new Customer

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Email = "2752154844@qq.com",

? ? ? ? ? ? ? ? ? ? ? ? Name = i.ToString()

? ? ? ? ? ? ? ? ? ? };

? ? ? ? ? ? ? ? ? ? customers.Add(customer);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ctx.Customers.AddRange(customers);

? ? ? ? ? ? ? ? ctx.SaveChanges();

? ? ? ? ? ? };

如果您給我的答案如上,我還是認可的,要是第一種真的說不過去了啊。經(jīng)過如上操作依然有問題,我們將所有記錄添加到同一上下文實例,這意味著EF會跟蹤這十萬條記錄, 對于剛開始添加的幾個記錄,會運行得很快,但是當越到后面到達到十萬時,EF正在追蹤更大的對象圖,您們覺得恐怖不,這就是您不懂EF原理的代價,還對其進行詬病,吐槽性能可以,至少保證你寫的代碼沒問題吧,我們進一步優(yōu)化需要關(guān)閉自調(diào)用的DetectChanges方法無需進行對每一個添加的實體進行掃描。

?

var customers = new List<Customer>();

? ? ? ? ? ? using (var ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? bool acd = ctx.Configuration.AutoDetectChangesEnabled;

? ? ? ? ? ? ? ? try

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? for (var i = 0; i <= 100000; i++)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? var customer = new Customer

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? Email = "2752154844@qq.com",

? ? ? ? ? ? ? ? ? ? ? ? ? ? Name = i.ToString()

? ? ? ? ? ? ? ? ? ? ? ? };

? ? ? ? ? ? ? ? ? ? ? ? customers.Add(customer);

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ctx.Customers.AddRange(customers);

? ? ? ? ? ? ? ? ? ? ctx.SaveChanges();

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? finally

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ctx.Configuration.AutoDetectChangesEnabled = acd;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? };

此時我們通過局部關(guān)閉自調(diào)用DetectChanges方法,此時EF不會跟蹤實體,這樣將不會造成全盤掃描而使得我們不會處于漫長的等待,如此優(yōu)化將節(jié)省大量時間。如果在我們了解原理的前提下知道添加數(shù)據(jù)到EF上下文中,隨著數(shù)據(jù)添加到集合中也會對已添加的數(shù)據(jù)進行全盤掃描,那我們何不創(chuàng)建不同的上下文進行批量添加呢?未經(jīng)測試在這種情況下是否比關(guān)閉自調(diào)用DetectChanges方法效率更高,僅供參考,代碼如下:

?

public static class EFContextExtensions

? ? {

? ? ? ? public static EfDbContext BatchInsert<T>(this EfDbContext context, T entity, int count, int batchSize) where T : class

? ? ? ? {

? ? ? ? ? ? context.Set<T>().Add(entity);


? ? ? ? ? ? if (count % batchSize == 0)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? context.SaveChanges();

? ? ? ? ? ? ? ? context.Dispose();

? ? ? ? ? ? ? ? context = new EfDbContext();

? ? ? ? ? ? }

? ? ? ? ? ? return context;

? ? ? ? }

? ? }

static void Main(string[] args)

? ? ? ? {

? ? ? ? ? ? var customers = new List<Customer>();

? ? ? ? ? ? EfDbContext ctx;

? ? ? ? ? ? using (ctx = new EfDbContext())

? ? ? ? ? ? {

? ? ? ? ? ? ? ? for (var i = 0; i <= 100000; i++)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? var customer = new Customer

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Email = "2752154844@qq.com",

? ? ? ? ? ? ? ? ? ? ? ? Name = i.ToString()

? ? ? ? ? ? ? ? ? ? };

? ? ? ? ? ? ? ? ? ? ctx = ctx.BatchInsert(customer, i, 100);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ctx.SaveChanges();

? ? ? ? ? ? };

? ? ? ? ? ? Console.ReadKey();

? ? ? ? }

總結(jié)

不喜勿噴,敢問您們到底會不會用EntityFramework啊,EF 6.x性能令人詬病但是至少得保證您們寫的代碼沒問題吧,您們可結(jié)合Dapper使用啊,擔心EF 6.x性能不行,那請用EntityFramework Core吧,你值得擁有。謹以此篇批判那些不會用EF的同行,還將EF和并發(fā)扯到一塊,EF不是用來抵抗并發(fā),它的出現(xiàn)是為了讓我將重心放在梳理業(yè)務(wù)對象,關(guān)注業(yè)務(wù)上,有關(guān)我對EF 6.x和EF Core 2.0理解全部集成到我寫的書《你必須掌握的EntityFramework 6.x與Core 2.0》最近即將出版,想了解的同行可關(guān)注下,謝謝。

原文地址: https://www.cnblogs.com/CreateMyself/p/8989983.html


.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

總結(jié)

以上是生活随笔為你收集整理的别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

久二影院| 亚洲精选在线观看 | 麻豆传媒视频在线免费观看 | 黄网站www| 久久另类小说 | 精品国内自产拍在线观看视频 | 少妇精品久久久一区二区免费 | 中文字幕观看av | 久久黄视频 | 性色av免费在线观看 | 亚洲视频高清 | 欧美国产日韩一区二区三区 | 五月亚洲综合 | 国产精成人品免费观看 | 精品国产一区二区三区男人吃奶 | 国产九九精品 | 97精品国产97久久久久久 | 日韩精品一区二区三区免费观看 | 综合色天天| 欧美 另类 交 | 精品亚洲视频在线观看 | 波多野结衣一区 | 五月天激情视频在线观看 | 日日干天夜夜 | 亚洲电影一级黄 | 久久久久美女 | 日韩一区正在播放 | 97免费视频在线 | 精品久久久久久久久久久久久久久久久久 | 日日操天天爽 | 激情五月五月婷婷 | 亚洲国内精品在线 | 四虎在线免费观看 | 国产在线免费 | 色视频国产直接看 | 亚洲国产中文字幕在线观看 | 日韩三级视频在线看 | 丰满少妇一级 | 国产成人专区 | 亚洲视频播放 | 久久综合精品国产一区二区三区 | 欧美成人a在线 | 91香蕉视频黄色 | 在线观看中文字幕dvd播放 | 99精品国产99久久久久久97 | 国产美女永久免费 | 日韩激情网| 国产精品视频全国免费观看 | 精品一区欧美 | 免费看一级特黄a大片 | 国产成人久久av | 久久精品高清 | 亚洲精选99 | 亚洲日本欧美 | 久久国色夜色精品国产 | 亚洲欧美精品在线 | 五月婷婷另类国产 | 国产理伦在线 | 日韩精品一区二区在线视频 | 99久久久国产免费 | 九九九九九九精品 | 免费看污的网站 | 日韩欧美一区二区在线观看 | 久久久久国产精品免费免费搜索 | 在线精品视频免费播放 | 国产色视频网站 | 首页国产精品 | 色综合久久综合网 | 日本久久成人 | 婷婷综合久久 | 色香com.| 国产精品18久久久久久久久 | 91精品久久久久久综合乱菊 | 天天草天天爽 | 国产精品99久久久久久人免费 | 久久国产精品一二三区 | 91视频免费看| 欧美日韩国产色综合一二三四 | 激情综合色图 | 久久久黄视频 | 婷婷资源站 | 日本爽妇网 | 日韩大陆欧美高清视频区 | 777奇米四色 | 在线日韩亚洲 | 手机在线看片日韩 | 亚洲区另类春色综合小说 | 五月天婷婷在线观看视频 | 久久天天躁夜夜躁狠狠85麻豆 | 久久久综合电影 | 美女视频免费精品 | 久久麻豆精品 | 六月丁香激情综合色啪小说 | 456成人精品影院 | www.天天色 | 综合久久久久 | 99精品在线免费观看 | 久久婷婷丁香 | 日韩视频免费播放 | 一级a性色生活片久久毛片波多野 | 中文字幕在线免费97 | 精品视频123区在线观看 | 国产在线观看你懂得 | 国产黄色片免费在线观看 | 国产精品热视频 | 狂野欧美激情性xxxx | 欧美日本日韩aⅴ在线视频 插插插色综合 | 亚洲手机天堂 | 久久久久综合精品福利啪啪 | 在线免费观看视频一区 | 色 免费观看 | 欧美 激情 国产 91 在线 | 二区精品视频 | 日韩欧三级 | 色搞搞| 久久久久国产精品视频 | www色网站| 99热国产在线 | 蜜桃av人人夜夜澡人人爽 | 一区二区三区四区五区在线视频 | 天天射日 | 日韩亚洲欧美中文字幕 | 久久久精品成人 | av大全在线看 | 91精品国产99久久久久久红楼 | 国产色婷婷| 免费观看日韩av | 狠狠操狠狠干2017 | 天天鲁一鲁摸一摸爽一爽 | 国产一区自拍视频 | 国产高清在线观看 | 国产在线色视频 | 黄色1级大片 | 视频在线观看亚洲 | 这里只有精品视频在线观看 | 色国产视频 | 国产成人av片 | 亚洲精品成人在线 | 精品一区二区三区久久久 | 最新午夜电影 | 免费看国产一级片 | 国产免费午夜 | 自拍超碰在线 | 在线看日韩| 国产精品99久久久精品免费观看 | 免费看成人 | 国产精品久久久久久一区二区三区 | 亚洲精品小视频在线观看 | 久久精品五月 | 亚洲精品高清视频在线观看 | 日韩黄在线观看 | a√国产免费a | 久久久久久精 | 久久黄色片子 | 又粗又长又大又爽又黄少妇毛片 | www五月天com | 51久久成人国产精品麻豆 | av电影在线免费 | 亚欧洲精品视频在线观看 | av中文在线影视 | 日本黄色免费在线 | 国产日韩在线观看一区 | 麻豆传媒精品 | 一级黄网| 91九色自拍| 日韩专区在线 | 久久精品79国产精品 | 国产在线观看高清视频 | 人人爱在线视频 | 亚洲欧洲视频 | 国产精品久久久久久久久久久久久久 | 激情网站网址 | 国产黄色免费电影 | 黄色国产在线 | 日韩免费在线视频观看 | 四虎在线观看 | 精品一区二区三区香蕉蜜桃 | 免费男女羞羞的视频网站中文字幕 | 久草在线视频看看 | av手机版 | 欧美伦理一区二区 | 久久只精品99品免费久23小说 | 女人18毛片a级毛片一区二区 | 日韩成人看片 | 国产一级视频在线 | 99精品视频在线 | a在线一区 | 激情 亚洲| 国产高清99| 国产精品99久久久久久久久久久久 | 欧美日韩性 | 日韩美女一级片 | 国产福利一区二区三区视频 | 国产中文字幕在线免费观看 | 久久久久9999亚洲精品 | 中文字幕一区在线 | 国产精品久久久久久久久久久久午夜 | 综合五月婷婷 | 亚洲成a人片77777潘金莲 | 国产97在线看 | 天天摸日日操 | 久久综合九色综合欧美就去吻 | 久久试看 | 亚洲专区路线二 | 亚洲2019精品 | 国产一区二区三区网站 | 日韩中文字幕免费视频 | 欧美精品在线视频观看 | 超碰在线观看99 | 午夜12点 | 天天翘av | 久久综合久久综合这里只有精品 | 精品久久久久久久久久久久 | 婷婷丁香狠狠爱 | 免费在线播放av电影 | 日韩在线观看中文 | 99精品在线观看 | 啪嗒啪嗒免费观看完整版 | 成人在线观看av | 91粉色视频 | 国产一区网址 | 亚洲综合在线发布 | 麻豆视频免费入口 | 国内揄拍国产精品 | 国产成人333kkk | 久久免费精彩视频 | 亚洲在线激情 | av在线播放免费 | 黄色小说视频在线 | 日本精品视频在线播放 | 九九久久久| 亚洲午夜精品久久久久久久久久久久 | 婷婷av综合 | 一区二区三高清 | 成人电影毛片 | 免费久久网 | 精品国产伦一区二区三区观看说明 | 97色免费视频 | 99热最新地址 | 久久精品欧美一 | 国产在线高清精品 | 丁香六月婷婷开心婷婷网 | 91完整版 | 人人射人人爽 | 探花视频免费在线观看 | 国产系列精品av | 国产99久久久久 | 91免费在线播放 | 91高清视频 | 亚洲日本va中文字幕 | 日韩a在线播放 | 日韩性网站| 免费a v在线 | 91视频国产高清 | 久久久黄视频 | 最新国产精品拍自在线播放 | 五月婷激情 | 欧美激情精品 | 手机看片久久 | 91大神精品视频在线观看 | 免费黄在线观看 | 精品国产美女在线 | 国产97视频在线 | 日韩精品国产一区 | 日本精品久久久久影院 | 人人草网站 | 精品毛片久久久久久 | 99精品视频观看 | 国产99亚洲 | 在线小视频国产 | 久久久高清免费视频 | 麻豆国产在线视频 | 久久久久成人精品 | 中文字幕在线一区二区三区 | 激情五月视频 | 国产在线v | 日韩av免费大片 | 欧美日韩精品在线观看 | 国产精品久久99综合免费观看尤物 | 天天曰天天干 | 中文字幕久久精品 | 久久亚洲综合国产精品99麻豆的功能介绍 | 国产精品一区二区久久精品爱涩 | 99免在线观看免费视频高清 | 亚洲视频精品在线 | 天堂av观看 | 在线国产不卡 | 国产精品99久久久久久久久 | 久久精品国产亚洲精品 | 欧美综合久久 | 国产午夜精品福利视频 | 在线观看av麻豆 | 97涩涩视频 | 欧美成人黄色片 | 久草网在线视频 | 免费在线观看av网站 | 在线观看岛国片 | 91电影福利| 久久一区精品 | 亚洲国产免费 | 国产精品视频最多的网站 | av综合站 | www.久草.com| 91免费看片黄 | 欧美高清成人 | 在线免费中文字幕 | 日韩二区在线观看 | 国产一区二区在线观看视频 | 欧美日韩国产在线 | 久久久色| 99国内精品 | 在线免费av播放 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 国产手机视频在线观看 | 欧美色道 | 色婷婷在线观看视频 | 国产精品久久久久久久午夜片 | 国产老太婆免费交性大片 | 国产亚洲字幕 | 免费观看版| 久久久久久久久久电影 | 青草视频免费观看 | 中午字幕在线 | 亚洲专区欧美 | 99久久精品无码一区二区毛片 | 国产成人综合精品 | 国产成人精品久久久 | 香蕉视频18 | 日韩一区正在播放 | 婷婷色网视频在线播放 | 国产一区在线观看免费 | 天天干天天干天天色 | 中文字幕免费高清av | 欧美日韩高清一区二区 | 国产麻豆精品久久一二三 | 91成人免费电影 | 91污污 | 久久字幕 | 欧美一级视频免费看 | 久草免费福利在线观看 | 五月婷婷综合色拍 | 国产精品日韩在线观看 | 日韩在线观看免费 | 亚洲精品综合一区二区 | 99国产精品一区二区 | 午夜久久精品 | 亚洲国产欧洲综合997久久, | 激情久久久久久久久久久久久久久久 | 欧美日韩一区二区久久 | 国产精品av在线 | 久久激情视频 久久 | av黄色av | 手机成人在线电影 | 久久av福利 | 中文字幕一区二区三区在线观看 | 亚洲狠狠操 | 精品久久久久久久久久岛国gif | 丁香视频全集免费观看 | 国产在线视频资源 | av在线免费网 | 亚洲成人xxx | 久久精久久精 | 欧美精品久久久久久久久久 | 国产精品亚州 | 久久99精品久久久久久三级 | 国产又粗又猛又黄又爽 | 综合精品久久 | 一区二区伦理 | 亚洲婷婷伊人 | 亚洲永久av | 久草在线免费电影 | 日韩啪啪小视频 | 91大片成人网| 97超碰国产精品 | 亚洲精品综合一二三区在线观看 | 色一级片 | 91精品国产乱码 | 国产亚洲观看 | 日日躁夜夜躁aaaaxxxx | 国产美女精品人人做人人爽 | 91福利小视频 | 美女黄频免费 | 欧美日韩不卡在线视频 | 亚洲国产wwwccc36天堂 | 久久午夜剧场 | 久草在线电影网 | 精品99免费视频 | 国产免费片 | 中文字幕在线观看国产 | 99精品在线直播 | 国产午夜精品av一区二区 | 亚洲天天摸日日摸天天欢 | 91视频最新网址 | 精品一二三四在线 | 久久国产精品二国产精品中国洋人 | 日韩精品免费在线视频 | 国产日韩精品久久 | 美女久久 | 国产精品久久在线观看 | 亚洲综合色视频在线观看 | 麻豆国产视频 | 97夜夜澡人人双人人人喊 | 国产 日韩 在线 亚洲 字幕 中文 | 国产一级片免费视频 | 亚洲免费视频观看 | 激情图片qvod | 久久在线免费观看视频 | 香蕉视频色 | av午夜电影 | 日本深夜福利视频 | 亚洲精品午夜国产va久久成人 | 久久黄色a级片 | 色视频一区 | 国产二区免费视频 | 天天操天天综合网 | 欧美做受69 | 国产九九九视频 | 成人午夜在线观看 | 亚洲欧洲精品在线 | 国产97在线视频 | 91一区二区三区久久久久国产乱 | av大全免费在线观看 | 久久精品一区二区国产 | 99中文字幕视频 | 日韩激情在线 | 久久免费视频4 | 日本最新高清不卡中文字幕 | 黄色一级大片在线观看 | 午夜精品区 | 日韩黄视频 | 色婷婷精品大在线视频 | 成人毛片久久 | 亚洲视频大全 | 亚洲jizzjizz日本少妇 | 久久黄色网址 | 人人精品久久 | 中文字幕在线播出 | 亚洲欧美va| 国产剧在线观看片 | 热99在线视频 | 国产视频一 | 亚洲成人精品在线观看 | 午夜精品一区二区三区免费 | 国产精品久久久久久久7电影 | 欧美性做爰猛烈叫床潮 | 在线国产能看的 | 欧美日韩在线观看一区二区三区 | 最近中文字幕免费大全 | 国产成人av综合色 | 91成人天堂久久成人 | 午夜精品99久久免费 | 久久久久久久久久伊人 | 日韩亚洲欧美中文字幕 | www色| 天天舔夜夜操 | 国产日韩精品欧美 | 欧美日韩在线精品一区二区 | 91原创在线观看 | 高清中文字幕av | 国产精品久久久久久久久毛片 | 精品国产精品一区二区夜夜嗨 | 亚洲精品456在线播放第一页 | 五月天六月色 | 国产精品一区二区av影院萌芽 | 亚洲艳情| 日韩精品在线播放 | 中文字幕电影一区 | 特级毛片在线免费观看 | 99久久婷婷国产 | 久久久久久久久久福利 | 久久婷婷激情 | 欧美综合干 | 在线国产视频 | 国内免费久久久久久久久久久 | 中文字幕欧美日韩va免费视频 | 在线一级片 | 五月视频 | 九九热在线观看 | 国产伦精品一区二区三区高清 | www色,com| 黄色在线成人 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 久久久亚洲网站 | a在线视频v视频 | 在线视频一区观看 | 麻豆传媒视频在线免费观看 | 国产91精品一区二区麻豆亚洲 | 99免在线观看免费视频高清 | 日韩精品中文字幕在线不卡尤物 | 精品国产亚洲一区二区麻豆 | 久久视精品 | 久久免费视频7 | 超碰97成人 | 欧美精品资源 | av片子在线观看 | 韩国av一区 | 亚洲三级国产 | 国产黄色高清 | 色婷婷福利 | 在线观看国产一区 | 97在线观看免费视频 | 国产视频日韩视频欧美视频 | 国产综合视频在线观看 | 日本中文字幕高清 | 日韩在线观看不卡 | 免费av在线网 | 欧美日韩在线观看一区二区三区 | 91热这里只有精品 | 亚洲欧美一区二区三区孕妇写真 | 看国产黄色片 | 久久精品99国产精品酒店日本 | 久草com| 免费人成网 | 免费在线国产精品 | 成年人黄色在线观看 | 在线国产能看的 | 亚洲欧美日韩精品久久久 | 视频一区久久 | 手机av电影在线 | 黄色官网在线观看 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 国产伦精品一区二区三区高清 | 欧美一级裸体视频 | 欧美一性一交一乱 | 91av电影| 亚洲永久精品视频 | 99免费在线观看 | 久久久久久久久久久国产精品 | 精品国产_亚洲人成在线 | 最新精品视频在线 | 黄色在线免费观看网址 | 五月天婷婷免费视频 | 91精品国产乱码久久桃 | 日韩欧美成 | 夜夜爽夜夜操 | 久久婷婷一区二区三区 | 国产精品亚州 | 福利久久久 | 成人片在线播放 | 国产综合小视频 | 黄色在线观看免费网站 | 99久久久国产精品美女 | 成人av.com | 狠狠干激情 | 三级小视频在线观看 | www婷婷| 国产资源中文字幕 | 免费在线观看不卡av | 色婷婷久久久综合中文字幕 | 亚洲精品无 | 久久久国产一区 | 天天干天天射天天操 | 五月天亚洲激情 | 日韩久久精品一区二区 | 日本久久不卡视频 | 亚洲 欧美 精品 | 激情喷水| 免费男女羞羞的视频网站中文字幕 | 色综合天天射 | 欧美韩国在线 | 91视频电影 | 欧美性色综合网 | 在线免费看黄色 | 亚洲精品视频国产 | 精品影院 | 日本乱码在线 | 国产精品色在线 | 久久精品欧美 | 亚洲精品久久久久中文字幕m男 | 欧美激情精品一区 | 色婷婷亚洲精品 | 欧亚日韩精品一区二区在线 | 香蕉视频网址 | 中文字幕第一页在线视频 | 久久久久久久国产精品影院 | 麻豆久久 | 精品国产日本 | 一级电影免费在线观看 | 毛片网站观看 | 久久成人欧美 | 久久免费激情视频 | 欧美在线观看视频 | 午夜精品麻豆 | 日韩丝袜视频 | 精油按摩av | 久久久久久激情 | 午夜影院先| 一区二区三区韩国免费中文网站 | bbbb操bbbb| 黄色av网站在线观看免费 | 天堂av网在线 | 久久人人爽人人人人片 | 高清久久久久久 | 最新中文字幕在线资源 | a级成人毛片 | 国产精品24小时在线观看 | 久久久久免费精品国产小说色大师 | 日韩在线高清免费视频 | 久久夜色精品国产欧美一区麻豆 | 99久热在线精品视频成人一区 | 久久久久久免费毛片精品 | 伊人婷婷 | 精品国产免费观看 | 欧美一区二区三区在线视频观看 | 国产精品永久久久久久久www | 亚洲最大激情中文字幕 | 超碰人在线 | 欧美 亚洲 另类 激情 另类 | 日韩一区二区三区免费视频 | 国产精品二区在线观看 | 久久国产美女 | 日日夜夜天天人人 | 狠狠狠狠狠色综合 | av丝袜天堂 | 91最新在线| 精品美女久久久久久免费 | 精品一区免费 | 激情久久久久久久久久久久久久久久 | 日韩乱码在线 | 色午夜 | 国产在线不卡视频 | 国产精品一区二区在线免费观看 | 日韩激情在线 | 99精品免费 | 国产精品精品国产色婷婷 | 中文字幕av网站 | 国产区精品在线观看 | 久久免费片 | 久久久精品国产一区二区电影四季 | 精品久久网站 | 国产又粗又猛又爽又黄的视频免费 | 91pony九色丨交换 | 成人动漫一区二区三区 | 成人av免费 | 亚洲二区精品 | 久久成人国产精品入口 | 一性一交视频 | 日韩在线视频观看 | 99久久久久国产精品免费 | 精品国产1区 | 精品视频资源站 | 日韩午夜一级片 | 狠狠干五月天 | 国产一区二区三区久久久 | 五月天,com | 999成人免费视频 | 欧美伦理一区二区 | 久久www免费人成看片高清 | 91麻豆操| 黄色网免费| 人人干狠狠干 | 欧美巨乳网 | 91丨九色丨91啦蝌蚪老版 | 狠狠色丁香久久婷婷综合_中 | 蜜臀av夜夜澡人人爽人人桃色 | 国产精品国产三级国产不产一地 | 日韩国产精品一区 | 久久综合干 | 激情网色 | 四虎欧美 | 国产最新91| 色婷婷狠狠干 | 国产一级二级av | 国产福利网站 | 免费在线观看一区二区三区 | 色婷婷国产精品 | 三级黄色网址 | 久久高清免费视频 | 狠狠躁日日躁夜夜躁av | 欧美国产亚洲精品久久久8v | 国产精品毛片一区 | 国产999| 成人超碰在线 | 在线久热 | 久青草视频在线观看 | 国产高清一| 国产黑丝一区二区三区 | 欧美性网站 | av资源免费观看 | 中文字幕在线播放一区二区 | 九九免费在线视频 | 成人黄色免费在线观看 | 亚洲欧洲精品一区二区 | 亚洲成a人片77777潘金莲 | 女人高潮一级片 | 国产精品午夜av | 久久亚洲国产精品 | 亚洲午夜精品久久久久久久久久久久 | 久久久首页 | 人人超在线公开视频 | 国产精品青草综合久久久久99 | 亚洲成a人片在线观看网站口工 | 精品极品在线 | 久久久久久久久久久久久久电影 | 99精品视频在线播放观看 | 免费日韩一级片 | 久久伦理网 | 中文字幕在线视频一区 | 久影院 | 亚洲视频精品在线 | 日韩激情中文字幕 | 天天操夜夜操 | 成人av中文字幕在线观看 | 亚洲成色777777在线观看影院 | 91人人视频在线观看 | 婷婷激情站 | 国产亚洲成av人片在线观看桃 | 久久久久久久久久电影 | 一本—道久久a久久精品蜜桃 | 日韩电影在线观看一区二区三区 | 久久99免费观看 | 九九免费在线观看视频 | 2017狠狠干 | 国产精品免费一区二区三区在线观看 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 久久精品91视频 | 激情 婷婷| 91视频高清完整版 | 成人av电影免费观看 | 亚洲天堂网站视频 | 国产成人精品电影久久久 | 久久久久欧美精品999 | 最近中文字幕免费视频 | www.天天操.com | 国产精品美女久久久久久免费 | 免费视频二区 | 91久草视频 | 亚洲国产手机在线 | 一级免费黄视频 | 亚洲精品在线二区 | 精品国产一区二区在线 | 麻豆视传媒官网免费观看 | 在线黄av| 99成人在线视频 | 婷婷激情久久 | 国产精品久久三 | 欧美精品一二三 | 伊人官网 | 久艹视频免费观看 | 久久人人爽视频 | 国产午夜一区二区 | 国产精品一区二区三区四区在线观看 | 久久国产一区二区三区 | 中文字幕乱码电影 | 成人av电影免费观看 | 国产精品婷婷 | 中文字幕av在线不卡 | 91一区啪爱嗯打偷拍欧美 | 国产一级片直播 | 中文字幕丝袜制服 | 日韩精品视频网站 | 日日夜夜中文字幕 | 婷婷在线精品视频 | 日韩精品在线看 | 青青河边草手机免费 | 美女视频免费精品 | 久久这里只有精品首页 | 久久草草热国产精品直播 | 亚洲国产中文字幕在线观看 | 99re8这里有精品热视频免费 | 中文字幕av网站 | 人人爽人人爽人人片av | 999久久久久久久久6666 | 午夜精品三区 | av在线电影免费观看 | 91九色性视频 | 亚洲欧美视频一区二区三区 | 国产精品九九久久99视频 | 黄色中文字幕在线 | 精品久久久久免费极品大片 | 天天操天天射天天 | 欧美va天堂va视频va在线 | 成年人在线观看网站 | 国产中文字幕国产 | 欧美大香线蕉线伊人久久 | 成人av高清在线 | 91人人插| 美女黄视频免费 | 在线免费国产视频 | 亚洲 欧美 变态 国产 另类 | 在线观看亚洲免费视频 | 免费成人av在线看 | 久久久精品国产免费观看一区二区 | 成人黄在线 | 六月丁香激情综合 | 高清av网站 | 精品91久久久久 | 久久综合九色九九 | 久久精品国产一区二区电影 | 亚洲男男gⅴgay双龙 | 夜夜干夜夜 | 国产精品视频观看 | 国产精品成久久久久三级 | 久久福利国产 | 成人免费一级 | 色是在线视频 | 久久一区91 | www.久久色| 肉色欧美久久久久久久免费看 | 久草在线视频精品 | 999久久国产 | 亚洲精品视频免费在线 | 天天天天天天天天操 | 99中文字幕 | 99精品国产99久久久久久福利 | 国产视频久 | 激情深爱五月 | av片一区二区 | 国产成人av网址 | 一区二区 不卡 | 亚洲高清国产视频 | 在线免费观看一区二区三区 | 成人av播放| 激情综合网婷婷 | 99热手机在线 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 手机成人免费视频 | 久久国产色 | 日本久久精品 | 国产黑丝一区二区三区 | 色天堂在线视频 | 黄色av影视| 在线 精品 国产 | 国产精品99久久99久久久二8 | 国产麻豆果冻传媒在线观看 | 色妞色视频一区二区三区四区 | 国产美腿白丝袜足在线av | 免费a v观看| 国产成人av电影 | 91黄视频在线 | 国产视频不卡 | 热99在线视频 | 色婷婷99 | 欧美日韩91 | 欧美综合久久久 | 国产一区二区三区视频在线 | 午夜精品久久久 | 亚洲精品999 | 天堂v中文 | 国产高清在线免费观看 | 日韩网站免费观看 | 色视频在线观看 | 狠狠躁日日躁狂躁夜夜躁av | 超碰在线免费97 | 超碰在线cao| 亚欧日韩成人h片 | 色婷婷福利视频 | 男女啪啪视屏 | 九色精品免费永久在线 | 精品国产1区| 免费一级片在线观看 | 日韩精品专区 | 丁香花中文字幕 | 毛片888 | av电影 一区二区 | 亚洲精品乱码久久久久久久久久 | 人人射人人爽 | 青青河边草免费视频 | 日韩高清精品免费观看 | 亚洲毛片久久 | 久久久精品日本 | 天天综合网入口 | 99精品视频99| 不卡的av片 | 欧美在线久久 | 日日干夜夜干 | 九九久久久久99精品 | 蜜臀久久99静品久久久久久 | 成人四虎| 99国产精品视频免费观看一公开 | 国产va饥渴难耐女保洁员在线观看 | 日韩一三区 | 国产不卡视频在线播放 | 91女神的呻吟细腰翘臀美女 | 四虎在线免费观看 | 久久99精品久久久久婷婷 | 日韩免费三级 | 亚洲视频 视频在线 | 综合色综合 | 久久超级碰 | 不卡电影一区二区三区 | 玖玖视频免费在线 | 久草观看 | 欧美日本啪啪无遮挡网站 | 欧美视频18 | 中文在线√天堂 | 精品国产色 | 综合在线亚洲 | 亚洲蜜桃在线 | 亚洲激情 在线 | 狠狠色综合网站久久久久久久 | 中文字幕一区二区三区四区久久 | 日韩视频三区 | 二区三区av| 伊人伊成久久人综合网站 | 亚洲电影图片小说 | 天堂va欧美va亚洲va老司机 | 日韩欧美国产免费播放 | 少妇自拍av | 午夜体验区 | 天堂va欧美va亚洲va老司机 | 在线激情影院一区 | 六月色婷婷| 国产一级免费在线观看 | 国产手机视频在线 | 国产69久久久欧美一级 | 人人爽人人爽人人爽 | 亚洲三区在线 | 五月婷香蕉久色在线看 | 99精品在线观看视频 | 国产精品久免费的黄网站 | 99热这里是精品 | 久久午夜精品 | 四虎在线观看精品视频 | 黄色影院在线观看 | 国产不卡在线看 | 国产精品美女久久久久久久 | www.av免费观看 | 男女免费视频观看 | 天天综合入口 | 日韩午夜网站 | 丁香婷婷久久久综合精品国产 | 日韩欧美高清免费 | 99久高清在线观看视频99精品热在线观看视频 | 四虎天堂| 尤物97国产精品久久精品国产 | 日韩v在线| 亚洲欧洲成人精品av97 | 久草在线一免费新视频 | 国产一区在线精品 | 成人资源站 | wwwwww国产 | 精品国产一区二区三区久久久蜜月 | 热re99久久精品国产66热 | 国产日产精品一区二区三区四区 | 国产福利精品视频 | www.亚洲精品在线 | 人人要人人澡人人爽人人dvd | 国产免费又爽又刺激在线观看 | 九九久久久 | 久久久久久久久久福利 | 日韩视频在线不卡 | 日本99干网 | aaa毛片视频 | 日韩免费一级a毛片在线播放一级 | 中文字幕一区二区三区在线观看 | 国产裸体无遮挡 | 五月开心色 | 久久久久二区 | 一级免费黄色 | 久久久久国产精品视频 | 国产人免费人成免费视频 | 日本3级在线观看 | 欧美午夜理伦三级在线观看 | 成人av av在线 | 狠狠操狠狠干天天操 | 天天爱天天操天天爽 | 久久久久国产一区二区 | 精品国产一区在线观看 | 精品国产伦一区二区三区观看方式 | 特级a老妇做爰全过程 | 在线成人免费电影 | 麻花天美星空视频 | 在线看成人 | 人人澡人人爽欧一区 | 亚洲成av人影院 | 日韩特级黄色片 | 国产成人精品在线 | 亚洲精品玖玖玖av在线看 | 成人啊 v | 狠狠的操你 | 久久人91精品久久久久久不卡 | 亚洲最新av在线网站 | 91久久奴性调教 | 69国产精品视频 | 欧美九九九 | 激情丁香5月 | 手机看片久久 | 黄色在线免费观看网站 | 婷婷国产一区二区三区 | 成人黄色毛片视频 | 一级黄毛片 | 国产精品高潮呻吟久久av无 | 国产精品欧美久久久久无广告 | 国产色道 | 99热国产在线| 精品视频专区 | 婷婷伊人网 | 91精品国产乱码 | www.久久久 | 免费男女羞羞的视频网站中文字幕 | 麻豆影视在线免费观看 | 久草视频在线资源站 | 999热线在线观看 | 麻豆久久| 国产精品美女久久久久久网站 | 午夜久久久精品 | 国产a视频免费观看 |