Entity Framework 代码优先将 TPT 转换为 TPH

Entity Framework Code First Convert TPT to TPH

我使用 EF Code First 使用 TPT 开发了一个应用程序(发布附件、评论等)。它工作正常并且正在与许多客户进行 beta 测试。但是有许多层次结构。所以我有一个包含各种继承模型的基础模型,每个模型都包含许多本身是继承类型的属性。

我注意到它非常慢,所以我查看了它正在生成的 SQL 并获得了帖子列表,EF 生成了 2000 多行 SQL。编译时间非常长,我不喜欢为每个请求通过网络发送那么多数据的想法。启动时获得 3 个帖子需要 5 秒。后面的调用就快多了,但是每次有recycle,速度又慢了。

我尝试过Dapper和手写代码,但问题是Dapper不适合需要依赖类型的多级查询; ie DisplayTemplates 和手写代码,虽然快速是不合适的,因为它会使未来的开发变得更加复杂。

我想尝试将一些代码 (tables) 移至 TPH,并考虑在违反第三规范和代码可维护性之间进行权衡,但接受 table,但是我找不到有关如何转换现有数据库的任何信息。

如果我从头开始,我会删除 [Table...] 注释,但是我假设如果我对填充的数据库执行此操作,我将丢失所有数据映射的 tables 并且它不会用现有数据填充新单曲 table。

这是正确的吗?是否有人知道如何或最佳实践将现有 table 从 TPT 转换为 TPH。

我只有少数客户使用此 运行 作为试用版,但如果我丢失了他们一半的数据,他们会不高兴的!!

我不知道有任何工具可以自动从 TPT 迁移到 TPH,但您可以在数据库迁移过程中自行迁移数据。

  1. 从 类
  2. 中删除 [Table] 注释
  3. 使用 Add-Migration 命令生成新的迁移。生成的迁移将包含一对 AddColumnDropForeignKeyDropIndexDropTable 调用
  4. 将所有 AddColumn 调用置于 Up 方法的顶部
  5. 编写一个 SQL 命令,填充 table 中新创建的列,其中包含层次结构的所有数据(不要忘记设置正确的 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] ...");
    
  6. 使用 Update-Database 命令更新您的数据库