Entity Framework Core 2.0的突破性变更
在之前的文章里,我們看到了EF Core 2.0的新特性和槽點(diǎn)。今天,我們來看一看EF Core的突破性變更。
\\不支持EF Core 1.x數(shù)據(jù)庫驅(qū)動(dòng)器
\\EF通過數(shù)據(jù)庫驅(qū)動(dòng)器為SQL Server、MySQL等數(shù)據(jù)庫生成SQL。EF沒有通用的OleDB或ODBC驅(qū)動(dòng)器,所以只能使用專門為它創(chuàng)建的數(shù)據(jù)庫驅(qū)動(dòng)器。
\\為了簡化數(shù)據(jù)庫驅(qū)動(dòng)器的開發(fā),EF Core更改了驅(qū)動(dòng)器API,不再提供向后兼容的能力。這意味著EF Core 1.0和1.1的驅(qū)動(dòng)器不再受EF Core 2.0的支持,如果要繼續(xù)使用它們,必須基于EF Core 2.0的API對它們進(jìn)行重寫。
\\根據(jù)微軟所述,“SQL Compact、PostgreSQL和MySQL的第三方開源數(shù)據(jù)庫驅(qū)動(dòng)器正在升級到2.0”。如果使用了其他數(shù)據(jù)庫,需要自行聯(lián)系驅(qū)動(dòng)器開發(fā)者。
\\IDbContextFactory被重命名為IDesignTimeDBContextFactory
\\IDbContextFactory類不應(yīng)該被作為DbContext工廠類來使用,雖然它的名字看起來有這個(gè)意味。實(shí)際上,這個(gè)類本應(yīng)被用在設(shè)計(jì)工具里,設(shè)計(jì)工具在生成數(shù)據(jù)庫遷移腳本時(shí)需要用到DbContext對象。
\\為了避免混淆,IDbContextFactory被標(biāo)記為“過時(shí)”的,設(shè)計(jì)工具可以改為調(diào)用IDesignTimeDBContextFactory。
\\與此相關(guān)的另一個(gè)變更是停止對DbContextFactoryOptions的支持,這個(gè)類不適用于設(shè)計(jì)時(shí)上下文的生成。
\\日志和診斷事件的變更
\\EF Core的日志和診斷事件變更包括:
\\- 發(fā)送給ILogger的消息事件ID發(fā)生了變化。事件ID在整個(gè)EF Core里是唯一的,而且消息遵循了MVC所使用的結(jié)構(gòu)化日志標(biāo)準(zhǔn)模式。 \\
- 日志類別也發(fā)生了變化。現(xiàn)在可以通過DbLoggerCategory訪問到各種日志類別。 \\
- DiagnosticSource使用了與相應(yīng)ILogger消息相同的事件ID。事件內(nèi)容均為派生自EventData的標(biāo)準(zhǔn)類型。\
雖說上面列出的都算得上是突破性的變更,但微軟希望它們不會(huì)對現(xiàn)有的應(yīng)用程序造成太大的影響。
\\內(nèi)存數(shù)據(jù)庫必須指定名字
\\在進(jìn)行性能測試時(shí),創(chuàng)建內(nèi)存數(shù)據(jù)庫是非常重要的一個(gè)輔助手段。雖然這并不能反映應(yīng)用程序在生產(chǎn)環(huán)境的真實(shí)行為,但在診斷業(yè)務(wù)邏輯時(shí)還是很有用的。
\\EF Core之前可以支持一個(gè)全局的匿名內(nèi)存數(shù)據(jù)庫,但現(xiàn)在要求開發(fā)人員必須為創(chuàng)建的每一個(gè)內(nèi)存數(shù)據(jù)庫命名。不過,同一個(gè)內(nèi)存數(shù)據(jù)庫仍然可以被多個(gè)上下文實(shí)例所共享。
\\只讀API的變更
\\EF Core停止支持由IProperty接口暴露出來的IsReadOnlyBeforeSave、IsReadOnlyAfterSave和IsStoreGeneratedAlways。它們被IProperty的BeforeSaveBehavior和AfterSaveBehavior所取代。文檔里寫道:
\\\被標(biāo)記為ValueGenerated.OnAddOrUpdate的屬性默認(rèn)會(huì)忽略當(dāng)前設(shè)定的值。也就是說,不管被追蹤實(shí)體的屬性是否發(fā)生了變化,比如被設(shè)定初始值或者被修改為其他值,它們都只使用store-generated的值。要想讓改變生效,可以通過設(shè)置BeforeSaveBehavior或AfterSaveBehavior來實(shí)現(xiàn)。
\\\因?yàn)樘砑恿诵碌淖侄?#xff0c;所以對于IProperty來說,這也算是一個(gè)突破性的變更。
\\ClientSetNull成為默認(rèn)的刪除行為
\\之前,EF Core有三種可能的級聯(lián)刪除行為:
\\- Cascade:依賴的實(shí)體也一并被刪除。這種級聯(lián)行為只對被上下文跟蹤到的實(shí)體有效。數(shù)據(jù)庫里也需要設(shè)置相應(yīng)的級聯(lián),確保沒有被上下文跟蹤到的數(shù)據(jù)也具備同樣的行為。如果你通過EF來創(chuàng)建數(shù)據(jù)庫,那么EF會(huì)為你設(shè)置好數(shù)據(jù)庫的級聯(lián)。 \\
- Restrict:刪除操作不會(huì)作用在依賴實(shí)體上,依賴實(shí)體保持不變。 \\
- SetNull:依賴實(shí)體的外鍵被設(shè)為null。這種級聯(lián)行為只對被上下文跟蹤到的實(shí)體有效。數(shù)據(jù)庫里也需要設(shè)置相應(yīng)的級聯(lián),確保沒有被上下文跟蹤到的數(shù)據(jù)也具備同樣的行為。如果你通過EF來創(chuàng)建數(shù)據(jù)庫,那么EF會(huì)為你設(shè)置好數(shù)據(jù)庫的級聯(lián)。\
EF Core 2.0新增了一種默認(rèn)行為,叫作ClientSetNull。
\\\EF Core 2.0引入了一種叫作ClientSetNull的默認(rèn)行為。它具有SetNull的語義,兼有Restrict的行為。從我們的經(jīng)驗(yàn)來看,對于被跟蹤的實(shí)體和數(shù)據(jù)庫來說,它是最被期待也是最有用的一種行為。
\\在為被跟蹤的實(shí)體設(shè)置級聯(lián)關(guān)系時(shí),DeleteBehavior.Restrict已經(jīng)成為歷史。
\\\設(shè)計(jì)時(shí)工具包的合并
\\Microsoft.EntityFrameworkCore.Relational.Design包被棄用,原先的內(nèi)容被合并到Microsoft.EntityFrameworkCore.Relational和Microsoft.EntityFrameworkCore.Design當(dāng)中。這樣做的好處是現(xiàn)在可以少引入一個(gè)包。
\\在后續(xù)的文章中,我們將會(huì)看到EF Core的路線圖。
\\查看英文原文: Breaking Changes in EF Core 2.0
總結(jié)
以上是生活随笔為你收集整理的Entity Framework Core 2.0的突破性变更的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用MyEclipse开发Java EE
- 下一篇: 《Spark与Hadoop大数据分析》—