ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

实体框架代码首先将TPT转换为TPH

2019-10-27 16:08:52  阅读:167  来源: 互联网

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


我使用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有