我有一个MVC Action,它使用EF从CSV文件导入数据。当我从CSV读取新记录时,我需要在保存之前检查该记录是否已经存在包括我已导入的记录,因此我可以更新它而不是创建新记录。
简单的解决方案是在每次SaveChanges()
通话后只dbContext.Entities.Add(newEntity)
,但我怀疑效率不高。这也意味着我无法在开始导入之前(轻松)回滚。即如果导入的任何部分失败,我可以避免调用SaveChanges()
我的问题是:在导入例程结束时,我可以在调用dbContext.SaveChanges()
一次之前搜索“已添加”实体,然后更新它们吗?
答案 0 :(得分:0)
是的,您可以检查数据库中是否已存在每个导入的实体。使用相同的上下文,并尝试在数据库中逐个查找它们。
如果实体不存在于数据库中,请保持原样(即,处于已添加状态)
如果实体已存在于数据库中,则修改从DB加载的实体:它没有改变,因为您刚刚从数据库中读取它,但是,当您修改它时,它将在{{1}中} status,这样,当您保存更改时,它将被更新。但是仍然有一个非常重要的步骤:您在数据库中找到的导入实体必须与上下文分离,以便在您调用Modified
时忽略它。
如果您不了解分离实体的内容,请阅读此专题文章:Entity Framework Add Remove Attach and Detach。
这解决了在一次操作中保存所有更改的问题。
答案 1 :(得分:0)
您可以在提交之前搜索“本地”数据集(即在调用SaveChanges()
之前)。请注意我使用的是EF5。
例如,以下对数据库的搜索将返回null。
Entity myEntity = new Entity() { Name = "search text" };
db.Entities.Add(myEntity);
existingEntity = db.Entities.(e => e.Name == myEntity.Name).SingleOrDefault();
但是下面的后续调用会在保存更改之前找到添加的实体,这样我就可以进行进一步的更改。
existingEntity = db.Set<Entity>().Local
.Entities.(e => e.Name == myEntity.Name).SingleOrDefault();