gra*_*son 4 c# entity-framework ef-code-first
我使用 EF Code First 使用 TPT 开发了一个应用程序(发布附件、评论等)。它运行良好,并且正在与许多客户进行 beta 测试。但是,存在许多层次结构。因此,我有一个包含各种继承模型的基本模型,每个模型都包含许多属性,这些属性本身就是继承类型。
我注意到它非常慢,因此我查看了它生成的 SQL 并获取帖子列表,EF 生成了 2000 多行 SQL。编译时间非常长,我不喜欢为每个请求通过网络发送那么多数据的想法。启动时需要 5 秒才能获得 3 个帖子。后面的调用速度快了很多,但是每次有回收,速度又慢了。
我尝试过 Dapper 和手写代码,但问题是 Dapper 不适合需要依赖类型的多级查询;即 DisplayTemplates 和手写代码,虽然快速是不合适的,因为它会使未来的开发变得更加复杂。
我想尝试将一些代码(表)移至 TPH 并考虑在违反第三规范和代码可维护性之间进行权衡是可以接受的,但我找不到有关如何转换现有数据库的任何信息。
如果我从头开始,我只会删除 [Table...] 注释,但是我假设如果我使用填充的数据库执行此操作,我将丢失映射表中的所有数据,并且不会填充新的数据包含现有数据的单个表。
它是否正确?有谁知道如何将现有表从 TPT 转换为 TPH 或最佳实践。
我只有几个客户将此作为试验运行,但如果我丢失一半的数据,他们不会高兴!
我不知道有任何工具可以自动从 TPT 迁移到 TPH,但您可以在数据库迁移过程中自行迁移数据。
[Table]注释Add-Migration。生成的迁移将包含几个AddColumn, DropForeignKey, DropIndex,DropTable调用AddColumn的顶部Up编写一条 SQL 命令,填充包含层次结构所有数据的表中新创建的列(不要忘记设置正确的Discriminator)。
UPDATE [TPHTable]
SET [TPHTable].[X] = [TPTTable].[X],
[TPHTable].[Discriminator] = "NameOfTheClass"
FROM [TPHTable] INNER JOIN [TPTTable]
ON [TPHTable].[ID] = [TPTTable].[ID]
Run Code Online (Sandbox Code Playgroud)
迁移允许您调用任意 SQL 命令,因此请将此 SQL 添加到方法调用Up之后的方法中AddColumn。
Sql(@"UPDATE [TPHTable] ...");
Run Code Online (Sandbox Code Playgroud)Update-Database使用以下命令更新数据库
| 归档时间: |
|
| 查看次数: |
1115 次 |
| 最近记录: |