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