我有一个MVC操作,它使用EF从CSV文件中导入数据。当我从CSV读取一个新记录时,我需要检查该记录是否已经存在,包括我在保存之前已经导入了的记录,这样我就可以更新它而不是创建一个新记录。
简单的解决方案是在每次调用SaveChanges()
之后只使用dbContext.Entities.Add(newEntity)
,但我怀疑这并不是非常有效。这也意味着,在开始导入之前,我不能(轻松)回滚。也就是说,如果导入的任何部分失败,我可以避免调用SaveChanges()
我的问题是:在导入例程结束时,在调用dbContext.SaveChanges()
之前,我可以搜索“添加”的实体,然后更新它们吗?
发布于 2013-12-02 17:52:33
是的,您可以检查每个导入的实体是否已经存在于数据库中。使用相同的上下文,并尝试一个一个地在数据库中找到它们。
如果该实体不存在于数据库中,则保持原样(tha在添加状态下)
如果实体已经存在于数据库中,那么修改从DB加载的实体:它没有改变,因为您刚刚从DB读取了它,但是,当您修改它时,它将处于Modified
状态,这样,当您保存更改时,它将被更新。但是还有一个非常重要的步骤:您在数据库中找到的导入实体必须与上下文分离,以便在调用SaveChanges()
时被忽略。
如果你不明白什么是分离一个实体,请阅读下面这篇感人文章:实体框架添加、删除、附加和分离。
这解决了将所有更改保存在一个操作中的问题。
https://stackoverflow.com/questions/20324216
复制相似问题