0

我有一组实体,我不知道它们是否已经存在于数据库中。如果它们存在 - 我需要更新它们,如果它们不存在 - 我需要添加它们(对于每个实体,它可能是一个或另一个,并且有 10000 个......)

(场景 - 我正在从文件中导入数据,如果我导入同一个文件 - 什么都不会发生,如果文件被更改 - 我需要更新)。

我可以使用 Entity Framework 来实现它,而无需在添加之前搜索每个实体吗?

(如果我想添加 - 我需要使用 AddObject,如果我想修改 - 我需要使用 attach 和 ChangeObjectState)。

有没有办法避免搜索 - 而不是两个选项之一?

(寻找“添加或更新”方式....)

谢谢。

4

2 回答 2

1

如果可以使用 DbContext API(EF 4.3 和 EF 5),则可以使用 AddOrUpdate 方法。当您启用迁移时,您将获得显示此方法用法的示例代码,或者您可以在 EF 团队的这篇较早的博客文章中看到一个示例:

http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-beta-1-automatic-migrations-walkthrough.aspx

于 2012-04-09T20:28:21.733 回答
1

不。在 EF 中,您必须知道是否要插入或更新实体 => 如果您不知道,则必须先搜索数据库。您可以通过不使用 EF 并直接使用 SQL 来降低复杂性,但在决定插入或更新之前,您仍然必须搜索实体。在直接 SQL 的情况下,这整个过程可以在单个数据库往返中完成(SQL Server 2008 提供了特殊的命令MERGE),而 EF 需要单独的往返进行搜索和单独的往返进行更新或插入。

编辑:另一个性能更好的解决方案是通过某种快速的方式将所有数据提取到数据库中 - 例如由存储过程填充的临时表,带有表值参数或批量插入。在某个处理表中拥有所有记录后,您可以使用 SQL 更新真实表中存在的所有记录并插入所有不存在的记录。

于 2012-04-09T16:29:46.863 回答