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