Entity Framework7 有哪些不一樣?之具體功能

Entity Framework7 有哪些不一樣?之具體功能

 

  前面咱們介紹了關於EF7的新特性、開發計劃和入門介紹。今天,咱們來看看EF7的具體新功能及用法。本文中的環境,爲EF7入門裏介紹的環境。html

  一、在Linq to Entity 查詢中對列使用類型轉換,請見以下代碼:數據庫

1 var result = db.Blogs.Where((b => Convert.ToInt32(b.IntString) == 2)).FirstOrDefault();

  代碼中的Convert.ToInt32(b.IntString),對列IntString轉換成Int32類型。生成SQL語句以下:框架

1 SELECT TOP(1) [b].[BlogId], [b].[IntString], [b].[Url]
2 FROM [Blog] AS [b]
3 WHERE (CONVERT(int, [b].[IntString]) = 2)

  備註,可能很多朋友想在Linq To Entity中使用 Tostring()方法,這在EF6.1中就支持了,日常還聽到很多朋友在感嘆,要是EF7支持枚舉就行了,其實,這個功能也是在EF6.1中就支持了ide

 

  二、Code-First下用數據遷移更新數據庫時使用修改(Alter)代替刪除(Dropping)後從新建立post

    在這以前,相信很多人吃過虧,由於以前模型發生變動,使用數據遷移更新數據庫結構時,是先刪除數據庫,再從新建立,這樣的問題是,會形成數據丟失。據說有人由於不熟悉這功能,把生產環境的數據也給弄丟失了。學習

 

  三、刪除孤兒(orphans)記錄ui

  這個,讓咱們直接舉例來講明。假設咱們有一個對多關係的模型,Blog和Post,在Blog實體中有導航屬性Posts。在數據庫中Post經過外鍵BlogId與Blog關聯,且BlogId不能爲空。若是咱們在Blog實體中,使用以下方法 Posts.Remove(post); 而後調用上下文對象中的SaveChages()保存修改。按理是應該把post對象的記錄給刪除掉,但實際的狀況是,我獲得了一個異常。緣由是如今EF版本是這樣處理的:它把從Blogs導航屬性集體中移除的post對象的BlogId設置爲null,然而數據庫中對應的外鍵又不能爲null,因而保存失敗。這個post也被形象的叫作孤兒(與父對象脫離了關係)對象。 EF7將會解決這一問題。代碼以下:spa

1           var result = db.Blogs.Where((b => Convert.ToInt32(b.IntString) == 2)).FirstOrDefault();
2 
3                 if (result != null)
4                 {
5                     var post = db.Posts.FirstOrDefault(p => p.PostId == 1);
6                     result.Posts.Remove(post);
7                     db.SaveChanges();
8                 }

下圖是EF6下的異常日誌

很遺憾的是,如今EF7的最新預發行版本EF7.0.0-beta7尚未解決這個問題,但異常的內容發生了改變.code

相信在後面版本會獲得處理,由於EF團隊已經承諾要解決這個問題。

 

  四、日誌記錄

    在日誌中查看EF生成的SQL,相信這種方法幫助過很多的人(固然不是所有,由於有人還不知道有這東西,作開發就得不停的學習!)。EF6中,你們是使用相似以下的代碼來記錄SQL語句:

1 db.Database.Log = s => Console.WriteLine(s);

    EF7中,爲了使用Microsoft.Framework.Logging日誌框架和依賴注入,關於日誌的接口是幾經變化。首先是去掉了上面的的Database.Log,在EF7.0.0-beta2中使用以下的方式:

1               db.Configuration.LoggerFactory.AddProvider(new DiagnosticsLoggerProvider(
2                 new SourceSwitch("SourceSwitch", "Verbose"),
3                 new ConsoleTraceListener()));    

    後來,微軟就去掉了db.Configuration,使用以下的方式:

1                 IServiceProvider contextServices = ((IDbContextServices)db).ScopedServiceProvider;
2                 var loggerFactory = contextServices.GetRequiredService<ILoggerFactory>();
3                 oggerFactory.AddConsole(LogLevel.Verbose);

    如今的版本中,又變成以下方式:

1                var service = ((IAccessor<IServiceProvider>)db).Service;
2                 var loggerFactory = service.GetRequiredService<ILoggerFactory>();
3                 loggerFactory.AddConsole(LogLevel.Verbose);

    也許,後面的Beta8,RC版本還會有調整,但能夠確認的是,它會愈來愈強。從日誌接口的變化也能夠看,EF7目錄處於開發過程當中,變化會很大。所以,文中介紹的功能,都是以目前已有的版本爲基礎,後面可能會變生變化,這一點要請你們注意。

 

 

  今天就先到這裏,有點不舒服。改天再慢慢寫。謝謝你的理解。

 

 

實體框架交流QQ羣:  458326058,歡迎有興趣的朋友加入一塊兒交流

謝謝你們的持續關注,個人博客地址:http://www.cnblogs.com/VolcanoCloud/

相關文章
相關標籤/搜索