2015-12-12 80 views
2

我已經開發了一個應用程序(帖子附件,評論等)使用EF代碼優先使用TPT。它工作正常,並且正在與一些客戶端進行beta測試,但是有很多層次結構。所以我有一個具有各種繼承模型的基礎模型,每個模型都包含許多本身是繼承類型的屬性。實體框架代碼首先轉換TPT到TPH

我注意到它非常慢,所以我查看了它正在生成的SQL並獲取帖子列表,EF正在生成2000多行SQL。編譯時間非常長,我不喜歡通過網絡爲每個請求發送大量數據的想法。啓動時需要5秒才能獲得3個帖子。隨後的通話速度要快得多,但每次有回收時,速度都會再次變慢。

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

我想嘗試將一些代碼(表格)移動到TPH,並考慮違反第三個規範和代碼可維護性之間的權衡是可以接受的,但我無法找到任何有關如何轉換現有D b。

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

這是正確的嗎?有誰知道如何或最佳實踐將現有的表格從TPT轉換爲TPH。

我只有少數客戶將此作爲試用版運行,但如果我失去了他們的一半數據,他們將不會感到高興!

+0

首先你的數據庫做實驗,以確認收益。然後嘗試EF可以生成哪種遷移可能很有趣。最後總是有一個(強力)解決方案來保存數據,只需重命名新的層次結構並複製這些內容即可。 –

回答

3

我不知道任何將自動從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命令

+0

精彩的回答。謝謝。 – grayson