添加/更新EF实体的最佳方式,如果添加的项目可能已经存在,也可能不存在

时间:2011-08-18 15:34:42

标签: sql entity-framework-4 sql-update add record

我需要一些使用EF添加/更新SQL记录的指导。假设我正在编写一个应用程序,将有关硬盘上文件的信息存储到EF4数据库中。当您按下按钮时,它将扫描指定路径中的所有文件(可能是整个驱动器),并将信息存储在数据库中,如文件大小,更改日期等。有时,文件将已从上一次运行中记录,所以它的属性应该更新;有时会首次检测到一批文件,需要添加。

我正在使用EF4,我正在寻找添加新文件信息和更新现有记录的最有效方法。据我了解,当我按下搜索按钮并检测到文件时,我将检查是否存在文件实体,检索其ID字段,并使用它来添加或更新相关信息;但如果它不存在,我将需要创建一个表示它及其相关对象的树(例如它的文件夹路径),并添加它。我还必须处理文件夹路径对象的合并。

在我看来,如果有数百万个文件,就像服务器上可能存在的那样,将整个数据库加载到上下文中并不理想或不实用。因此,对于每个文件,我可能需要在磁盘上进行往返数据库以检测条目是否已存在,如果存在则检索其ID,然后再进行另一次更新。有没有更有效的方法可以在一次数据库中插入/更新多个文件对象树?如果有一个实体上下文方法,例如“如果它不存在则插入并且如果它存在则更新”,那么我可以在事务中包含多个?

我认为这是一个相当普遍的要求,如何在EF中做得最好?任何想法都将不胜感激。(哦,我的数据库是SQLITE,如果这有所作为)

1 个答案:

答案 0 :(得分:1)

您可以检查数据库中是否已存在该记录。如果没有,请创建并添加记录。然后,您可以设置记录的字段,这些字段将像下面的示例代码一样插入和更新。

           var strategy_property_in_db = _dbContext.ParameterValues().Where(r => r.Name == strategy_property.Name).FirstOrDefault();
            if (strategy_property_in_db == null)
            {
                strategy_property_in_db = new ParameterValue() { Name = strategy_property.Name };
                _dbContext.AddObject("ParameterValues", strategy_property_in_db);
            }
            strategy_property_in_db.Value = strategy_property.Value;