gpt4 book ai didi

c# - 在调用 Add() 之后但在调用 SaveChanges() 之前从上下文中检索实体

转载 作者:太空狗 更新时间:2023-10-29 21:10:35 26 4
gpt4 key购买 nike

假设我有一个包含多行的文件,每行代表一个 PersonPerson 实体有一个 identity column,它也是 主键。假设 Person 可以在文件中重复,如果是的话,也许我想做一个最后一次获胜的场景。在下面的示例中,我使用存储库通过社会保险号从数据库中检索一个人。问题是,当相同的 SSN 再次出现在文件中时,存储库仍然返回空值,即使从技术上讲,具有该 SSN 的人已经添加到上下文中(SaveChanges 尚未添加)尚未调用)。我意识到我可以通过跟踪自己已经添加了哪些 Person 对象来解决这个问题。我想知道这种情况的最佳做法是什么。谢谢。

foreach(row in fileRows)
{
Person person = personRepository.GetBySSN(row.SSN);

if(person == null)
{
//insert logic
}
else
{
//update logic
}
}

personRepository.SaveChanges();

最佳答案

我想我可以给出与 here 相同的答案

要持久化实体,您通常将其添加到上下文中的 DbSet

例如

var bar = new Bar();
bar.Name = "foo";
var context = new Context();
context.Bars.Add(bar);

奇怪的是,查询context.Bars,找不到刚刚添加的实体

var howMany = context.Bars.Count(b => b.Name == "foo");
// howMany == 0

context.SaveChanges() 之后,同一行将产生 1

DbSet 似乎不知道变化,直到它们被持久化在数据库上。

幸运的是,每个 DbSet 都有一个 Local 属性,其作用类似于 DbSet 本身,但它反射(reflect)了所有内存操作

var howMany = context.Bars.Local.Count(b => b.Name == "foo");
// howMany == 1

你也可以使用Local来添加实体

context.Bars.Local.Add(bar);

并摆脱 Entity Framework 的怪异行为。

关于c# - 在调用 Add() 之后但在调用 SaveChanges() 之前从上下文中检索实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6457382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com