我有一组实体,我不知道它们是否已存在于数据库中。 如果它们存在 - 我需要更新它们,如果它们不存在 - 我需要添加它们(对于每个实体它可能是一个或另一个,并且有10000个......)
(场景 - 我正在从文件导入数据,如果我导入相同的文件 - 如果文件被更改则不会发生任何事情 - 我需要更新)。
我可以使用Entity Framework实现它而不必在添加之前搜索每个实体吗?
(如果我想添加 - 我需要使用AddObject,如果我想修改 - 我需要使用attach和ChangeObjectState)。
有没有办法避免搜索 - 而不是选择其中一个选项?
(寻找“添加或更新”方式....)
感谢。
答案 0 :(得分:1)
没有。在EF中,您必须知道是否要插入或更新实体=>如果你不知道它,你必须首先搜索数据库。您可以通过不使用EF并直接使用SQL来降低复杂性,但在决定插入或更新之前,您仍需要搜索实体。在直接SQL的情况下,整个可以在单个数据库往返中完成(SQL Server 2008提供特殊命令MERGE
这个),而EF需要单独的往返用于搜索和单独的往返更新或插入。
编辑:具有更好性能的另一个解决方案是通过某种快速方式将所有数据提取到数据库 - 例如,由具有表值参数的存储过程填充的临时表或使用批量插入。在某个处理表中包含所有记录后,您可以使用SQL更新实际表中存在的所有记录,并插入所有不存在的记录。
答案 1 :(得分:1)
如果可以使用DbContext API(EF 4.3和EF 5),则可以使用AddOrUpdate方法。您可以在启用迁移时获得显示此方法用法的示例代码,或者您可以在EF团队的旧博客文章中看到一个示例: