我是否可以回忆并更新尚未保存到数据库的实体框架中的已添加实体?

时间:2013-12-02 08:54:11

标签: c# asp.net entity-framework

我有一个MVC Action,它使用EF从CSV文件导入数据。当我从CSV读取新记录时,我需要在保存之前检查该记录是否已经存在包括我已导入的记录,因此我可以更新它而不是创建新记录。

简单的解决方案是在每次SaveChanges()通话后只dbContext.Entities.Add(newEntity),但我怀疑效率不高。这也意味着我无法在开始导入之前(轻松)回滚。即如果导入的任何部分失败,我可以避免调用SaveChanges()

我的问题是:在导入例程结束时,我可以在调用dbContext.SaveChanges()一次之前搜索“已添加”实体,然后更新它们吗?

2 个答案:

答案 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();