【问题标题】:Entity Framework Code First Convert TPT to TPH实体框架代码先将TPT转换为TPH
【发布时间】:2015-12-12 19:54:06
【问题描述】:

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

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

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

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

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

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

我只有几个客户在试用,但如果我丢失了他们一半的数据,他们会不高兴的!!

【问题讨论】:

  • 首先做你的实验来确认好处。然后尝试 EF 可以生成什么样的迁移可能会很有趣。最后总是有一个(蛮力)解决方案来保留数据,只需重命名新层次结构并复制内容。

标签: c# entity-framework ef-code-first


【解决方案1】:

我不知道有任何工具可以自动从 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 命令更新您的数据库

【讨论】:

  • 精彩的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多