使用 Entity Framework Code First 迁移播种大型查找表数据

Posted

技术标签:

【中文标题】使用 Entity Framework Code First 迁移播种大型查找表数据【英文标题】:Seeding large lookup table data with Entity Framework Code First migrations 【发布时间】:2013-08-22 15:14:43 【问题描述】:

我即将开始一个新项目,我想使用 Entity Framework Code First 迁移;即,用代码编写数据库并为我自动生成所有数据库并更新架构等。

但是,我的绊脚石是我有一个需要导入的查找表,并且有超过 200 万条记录(这是一个邮政编码查找表)。

我的问题是,在 Entity Framework Code First 迁移中,您如何处理如此庞大的预填充查找表?

【问题讨论】:

【参考方案1】:

您的迁移实际上不必删除/重新创建整个表(除非您指定它应该这样做,否则不会)。通常,迁移只是执行 Up/Down 方法来使用附加列等更改表。

你真的需要放下桌子吗?如果是这样,你真的需要从 EF 播种吗?执行 200 万次插入的 EF 成本将是惊人的,因此,如果您可以通过更高效的手动步骤(将使用批量插入)来执行此操作,那将是非常可取的。

如果我必须执行那么多插入操作,我可能会将其分解为 SQL 文件并执行此处提到的操作:EF 5 Code First Migration Bulk SQL Data Seeding

【讨论】:

Seed 方法的问题在于它会运行每次迁移,因此您必须编写 sql 来检查数据在插入之前是否不存在。我认为在迁移asp.net/mvc/tutorials/deployment/visual-studio-web-deployment/… 的 Up() 方法中使用 Sql("INSERT..") 更好地添加固定数据 @Colin 当我们谈论 200 万条记录时,我完全不同意。必须在 SQL 的顶部编写 EXISTS 语句以使其在 10 分钟而不是 10 小时内运行似乎是一个很好的权衡。 在确认答案之前,我将进行更多实验。感谢您的帮助。 @wilso132。对不起,我的意思不是很清楚。如果您将代码添加到 Seed 方法,那么每次您随后更新数据库时都会运行代码,并且有 2,000,000 条记录,即使使用 EXISTS 检查也可能很昂贵。如果您在迁移中执行插入,则代码仅在您应用该迁移时运行。将其放入正确的迁移中,您就知道记录不存在,您可以考虑将存在的检查退出。您还应该删除 Down() 中的记录 - 以确保仍然可以一路撕下,然后备份 您可能会发现此博客与此问题相关 - blog.oneunicorn.com/2013/05/28/…

以上是关于使用 Entity Framework Code First 迁移播种大型查找表数据的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 5.0 Code First全面学习

Entity Framework Code First 迁移 Migrations

Entity Framework Code-First(23):Entity Framework Power Tools

Entity Framework Code First迁移基本面拾遗

Entity Framework工具POCO Code First Generator的使用

Entity Framework Code First Custom Conventions