前沿拓展:
net framework 2
Windows10已經(jīng)安裝了 .NET Framework 4.6.2 或靜版本更高的更新但是沒有.net framework是設(shè)置錯(cuò)誤造成的,解決方法為:
1、在我的電腦C盤中,找到目錄C:Windows***.netFramework,可以看到已安裝的.net framework,可以選擇某個(gè)版本進(jìn)行注冊(cè)。
2、這里我們選擇.net framework 4.5進(jìn)行注冊(cè),即選擇文件夾C:Windows***.netFrameworkv4.0.30319。
3、在文件夾中找到文件“aspnet_regiis.exe”。
4、打開命令行,將“aspnet_regiis.exe”拖到命令行中,輸氫均入 -i。
5、執(zhí)行命令,完成.net framework的重新注冊(cè)。
注意事項(xiàng):
Windows 10**作系統(tǒng)在易用性和安全性方面有了極大的提升,除了針對(duì)云服務(wù)、智能移動(dòng)設(shè)備、自然人機(jī)交互等新技術(shù)進(jìn)行融合外,還對(duì)固態(tài)硬完善與支持。
對(duì)于EF的**作,我們已經(jīng)有了大概的了解了,但對(duì)于實(shí)戰(zhàn)來說,似乎還欠缺著一些常用的功能,那就是批量的刪除,更新數(shù)據(jù)。
承接上面的部分,我們有一個(gè)叫做House的數(shù)據(jù)庫,其中包含house表和seller表。
一、使用原生EF如何實(shí)現(xiàn)批量刪除和修改?
//批量修改
public static bool UpdateAllPrice(decimal price)
{
bool isOk = false;
using (HouseEntities db = new HouseEntities())
{
var houseList = db.House.ToList();
//第一獲取所有房屋的列表(相當(dāng)于select * from house,雖然實(shí)際會(huì)把*替換為所有字段,這樣能提升性能)
houseList.ForEach(x => {
x.Price = price;//做一個(gè)foreach**作來把每一項(xiàng)的價(jià)格改為傳入的價(jià)格
db.Entry(x).State = System.Data.Entity.EntityState.Modified;//把修改后的實(shí)體標(biāo)為已修改
});
isOk = db.SaveChanges() > 0;//若修改數(shù)量大于0說明成功
}
return isOk;
}
//批量刪除
public static bool DeleteHouseByRegion(string region)
{
bool isOk = false;
using (HouseEntities db = new HouseEntities())
{
var houseList = db.House.Where(x=>x.Region==region).ToList();
//第一獲取符合條件的房屋的列表
houseList.ForEach(x =>
{
db.Entry(x).State = System.Data.Entity.EntityState.Deleted;//把修改后的實(shí)體標(biāo)為已刪除
});
isOk = db.SaveChanges() > 0;//若修改數(shù)量大于0說明成功
}
return isOk;
}
由上面的示例代碼可以看到。無論是批量刪除、修改部分?jǐn)?shù)據(jù),還是所有數(shù)據(jù)。第一都需要對(duì)**作對(duì)象進(jìn)行查詢并實(shí)例化,再使用遍歷方法對(duì)其進(jìn)行修改,刪除。
這種方式看起來十分奇怪,以前用SQL,Delete House where region=’xxx’,或者update house set price=123.123所能實(shí)現(xiàn)的功能,現(xiàn)在竟然浪費(fèi)了這么多的功夫,光是浪費(fèi)功夫也就算了,EF這種寫法在性能上也存在著十分巨大的問題(光是每次查詢就夠浪費(fèi)性能的了,更別說維護(hù)實(shí)例的狀態(tài),好在EF會(huì)對(duì)沒有更新的對(duì)象撤銷UPDATE**作,但感覺還是得不償失)。
那問題在這里已經(jīng)很明顯了,如何解決它呢?那就要用到entityframework中一個(gè)非常好用的擴(kuò)展“Entityframework.Extended”。這是一個(gè)開源的擴(kuò)展類庫,需要.NET 4.0以上的版本才能夠支持。你可以在nuget和github上找到它。它使用Lambda表達(dá)式樹的形式,對(duì)對(duì)象進(jìn)行了解析,在解析后直接生成SQL指令來完成數(shù)據(jù)庫**作,相比傳統(tǒng)SQL來說,這樣做不僅使我們的代碼更加優(yōu)美,在安全性和性能方面,也使我們更加放心。
二、Entityframework.Extended安裝
和其他類庫一樣,安裝的時(shí)候只要在NUGET上進(jìn)行搜索就行了,如果搜索不到請(qǐng)嘗試添加8.8.8.8來做DNS服務(wù)器(實(shí)在找不到就等等吧,國(guó)外網(wǎng)站經(jīng)常被墻,哪怕是正常的網(wǎng)站)。
如上圖所示即可完成安裝(什么?你找不到nuget?好吧,我想我的第一篇文章和VS右上角自帶的搜索框能幫助你。
三、使用Entityframework.Extended實(shí)現(xiàn)批量刪除和修改
//批量更新
public static bool UpdateAllPrice(decimal price)
{
bool isOk = false;
using (HouseEntities db = new HouseEntities())
{
isOk = db.House.Update(x => new House() { Price = price }) > 0;
//直接會(huì)生成update house set price=xxx的語句并返回受影響行數(shù),這里的X無實(shí)際作用,但作為MemberInitExpression,其卻是不可缺少的一個(gè)部分,這里要注意,不能先new對(duì)象再進(jìn)行對(duì)象傳輸,因?yàn)樽ト?zhǔn)確字段的時(shí)候,我們要用到init表達(dá)式,如果對(duì)象已經(jīng)被生成,所有非空字段都將被初始化,這對(duì)我們來說,完全不必要。
}
return isOk;
}
//批量刪除
public static bool DeleteHouseByRegion(string region)
{
bool isOk = false;
using (HouseEntities db = new HouseEntities())
{
isOk = db.House.Where(x => x.Region == region).Delete() > 0;//在where后面直接跟Delete就可以實(shí)現(xiàn)批量刪除了, 是不是很方便?
}
return isOk;
}
上面的代碼就是使用extended擴(kuò)展庫之后的寫法了,不僅整個(gè)代碼優(yōu)美了許多,更實(shí)現(xiàn)了更好的性能。在使用擴(kuò)展庫之前,別忘了引用EntityFramework.Extensions命名空間,擴(kuò)展類是沒有SDK自動(dòng)提醒的。
另外,大家有沒有發(fā)現(xiàn)?我之前說的,修改,刪除,添加**作后一定要savingchanges(),這里沒寫,是不是錯(cuò)了?當(dāng)然不是,擴(kuò)展庫直接生成了SQL語句并采用了ADO.NET的方式進(jìn)行了執(zhí)行,所以并不需要寫savingchanges,在這些擴(kuò)展方法執(zhí)行之后就會(huì)返回受影響的行數(shù)了。
拓展知識(shí):
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請(qǐng)注明出處:http:///33859.html