簡體   English   中英

實體框架代碼首先將TPT轉換為TPH

[英]Entity Framework Code First Convert TPT to TPH

我使用TPT使用EF Code First開發了一個應用程序(發布附件,評論等)。 它工作正常,並與許多客戶進行beta測試。但是有許多層次結構。 所以我有一個帶有各種繼承模型的基礎模型,每個模型都包含許多本身都是繼承類型的屬性。

我注意到它非常慢,因此我查看了它生成的SQL並獲得了一個帖子列表,EF生成了超過2000行SQL。 編譯時間非常長,我不喜歡通過線路為每個請求發送那么多數據的想法。 在啟動時獲得3個帖子需要5秒鍾。 后續調用要快得多,但每次有循環時,速度再慢。

我嘗試過Dapper和手寫代碼,但問題是Dapper不適合需要依賴類型的多級查詢; 即DisplayTemplates和手寫代碼,而快速不合適,因為它使未來的開發變得更加復雜。

我想嘗試將一些代碼(表)移動到TPH,並考慮在違反第三個規范和代碼可維護性之間進行權衡,但我無法找到有關如何轉換現有數據庫的任何信息。

如果我從頭開始,我會刪除[Table ...]注釋,但是我假設如果我使用填充的數據庫執行此操作,我將丟失映射表中的所有數據並且它不會填充新的單表與現有數據。

它是否正確? 是否有人知道如何或最佳實踐將現有表從TPT轉換為TPH。

我只有幾個客戶試用這個,但如果我丟失了一半的數據他們就不會高興!!

我不知道有任何工具會自動從TPT遷移到TPH,但您可以自己遷移數據作為數據庫遷移的一部分。

  1. 從類中刪除[Table]注釋
  2. 使用“ Add-Migration命令生成新遷移。 生成的遷移將包含幾個AddColumnDropForeignKeyDropIndexDropTable調用
  3. 將所有AddColumn調用放在Up方法的頂部
  4. 編寫一個SQL命令,用於填充表中包含層次結構所有數據的新創建的列(不要忘記設置正確的Discriminator )。

     UPDATE [TPHTable] SET [TPHTable].[X] = [TPTTable].[X], [TPHTable].[Discriminator] = "NameOfTheClass" FROM [TPHTable] INNER JOIN [TPTTable] ON [TPHTable].[ID] = [TPTTable].[ID] 

    遷移允許您調用任意SQL命令,因此在AddColumn方法調用之后立即將此SQL添加到Up方法。

     Sql(@"UPDATE [TPHTable] ..."); 
  5. 使用Update-Database命令Update-Database

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM