C# 我是否可以在实体框架中调用并更新尚未保存到数据库中的添加实体?

C# 我是否可以在实体框架中调用并更新尚未保存到数据库中的添加实体?,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有一个MVC操作,它使用EF从CSV文件导入数据。当我从CSV读取新记录时,我需要检查该记录是否已经存在,包括保存前已导入的记录,以便更新它而不是创建新记录 简单的解决方案是在每次dbContext.Entities.AddnewEntity调用之后保存更改,但我认为这不是很有效。这也意味着我无法在开始导入之前轻松回滚到。也就是说,如果导入的任何部分失败,我可以避免调用SaveChanges 我的问题是:在导入例程结束时调用dbContext.SaveChanges一次之前,是否可以搜索并更新

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

简单的解决方案是在每次dbContext.Entities.AddnewEntity调用之后保存更改,但我认为这不是很有效。这也意味着我无法在开始导入之前轻松回滚到。也就是说,如果导入的任何部分失败,我可以避免调用SaveChanges


我的问题是:在导入例程结束时调用dbContext.SaveChanges一次之前,是否可以搜索并更新添加的实体?

是的,您可以检查数据库中是否已经存在每个导入的实体。使用相同的上下文,并尝试在数据库中逐个查找它们

如果该实体在数据库中不存在,则将其保持原样,处于添加状态

如果该实体已存在于数据库中,请修改从数据库加载的实体:该实体没有更改,因为您刚刚从数据库中读取了该实体,但是,当您修改它时,它将处于修改状态,因此,在保存更改时,它将被更新。但还有一个非常重要的步骤:必须将在数据库中找到的导入实体与上下文分离,以便在调用SaveChanges时忽略它

如果您不理解分离实体的方法,请阅读本文:


这可以解决在一次操作中保存所有更改的问题。

您可以在提交本地数据集之前(即在调用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();

需要更多信息:您要添加多少行?数据库表中还有多少行?如何将CSV中的行与DB中的行进行匹配?这有助于确定哪种方法最快。@JotaBe数据库表中有1000条记录,每次最多只导入200条。我想通过几个非关键字段匹配导入的数据。谢谢@JotaBe,但这不是我想要的。我需要检查已添加但尚未提交到数据库的实体列表。即使我已经添加了一个空实体,查询数据库也会返回一个空实体。如果您不更清楚地解释整个过程,将很难帮助您。展示更多的代码,并解释您想要实现什么以及为什么不能实现。对不起,我不明白你在干什么。我不介意是EF4,5还是6。。。我确信所有这些问题都有解决办法,但前提是我理解问题所在。@JotaBe我感谢你的帮助,但我已经为自己找到了答案——解决办法就在上面。我认为它可能只对EF5+有效。解决方案的关键部分是db.Set.Local,它提供对尚未保存的实体的访问。我不知道我怎么能解释得更清楚。