实体框架代码首先将TPT转换为TPH
作者:互联网
我使用TPT使用EF Code First开发了一个应用程序(帖子附件,评论等).它运行良好,并且正在与许多客户端进行Beta测试.但是,存在许多层次结构.因此,我有一个带有各种继承模型的基本模型,每个模型都包含许多本身就是继承类型的属性.
我注意到它非常慢,因此我查看了它所生成的SQL并获得了帖子列表,EF生成了2000行以上的SQL.编译时间非常长,我不喜欢为每个请求通过网络发送那么多数据的想法.启动需要3秒钟才能花费5秒.后续调用要快得多,但是每次进行回收时,速度都会再次变慢.
我已经尝试过Dapper和手写代码,但是问题是Dapper不适合需要依赖类型的多级查询;即DisplayTemplates和手写代码,而快速不适合,因为它会使将来的开发变得更加复杂.
我想尝试将一些代码(表)移至TPH并进行实验,以考虑在违反第三规范和代码可维护性之间进行权衡取舍,但我找不到有关如何转换现有数据库的任何信息.
如果我是从头开始的话,我将删除[Table …]批注,但是我假设如果我使用填充的db执行此操作,那么我将丢失映射表中的所有数据,并且不会填充新的具有现有数据的单个表.
这个对吗?有谁知道如何将现有表从TPT转换为TPH或最佳实践.
我只有几个客户端正在试用,但是如果我丢失了一半的数据,他们将不会满意!
解决方法:
我不知道有任何工具可以自动完成从TPT到TPH的迁移,但是您可以自己迁移数据,这是数据库迁移的一部分.
>从类中删除[Table]批注
>使用“添加迁移”命令生成新迁移.生成的迁移将包含几个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]
迁移允许您调用任意SQL命令,因此在AddColumn方法调用之后,将此SQL添加到Up方法中.
Sql(@"UPDATE [TPHTable] ...");
>使用Update-Database命令更新数据库
标签:ef-code-first,c,entity-framework 来源: https://codeday.me/bug/20191027/1945628.html