C# DbSet:缺少添加的项
在实体框架(6.1.3)的C# DbSet:缺少添加的项,c#,.net,entity-framework,C#,.net,Entity Framework,在实体框架(6.1.3)的DbSet实体集合中,当我添加新项时,它不会从集合中返回。这是奇怪和意外的。下面是一些收集的示例代码: dbContext.Entities.ToArray(); // contains 3 entries dbContext.Entities.Add(new Entity()); dbContext.Entities.ToArray(); // still contains 3 entries 这怎么可能?当我在VisualStudio的即时窗口中查询dbConte
DbSet
实体集合中,当我添加新项时,它不会从集合中返回。这是奇怪和意外的。下面是一些收集的示例代码:
dbContext.Entities.ToArray();
// contains 3 entries
dbContext.Entities.Add(new Entity());
dbContext.Entities.ToArray();
// still contains 3 entries
这怎么可能?当我在VisualStudio的即时窗口中查询dbContext.Entities
时,它会显示类似“Local:Count=4”的内容。为什么它对我隐藏新项目
更新:如果此集合没有做显而易见的事情–返回以前添加的内容–我需要做什么?它必须在第一次调用时返回数据库中的所有记录,并且在以后调用时还必须包含所有更改(添加和删除)<代码>保存更改仅在用户完成编辑后调用。在此之前需要收集<当用户完成编辑时,代码>保存更改也可能在两者之间的某个位置被调用,但是代码可能会返回,并且视图可能会在以后再次显示。您必须保存更改。试一试
dbContext.State = EntityState.Added;
dbContext.SaveChanges();
添加新实体后,必须使用dbContext对象保存更改,使用 dbContext.SaveChanges();或dbContext.EntityState.AddedA有一个属性
Local
。这是一个包含所有元素的可观察集合。DbSet
对象本身只表示对数据库的查询
从财产的文件中:
获取表示所有对象的本地视图的ObservableCollection
在此集合中添加、更改和修改实体。这是本地的观点
将在从上下文中添加或删除实体时保持同步。
同样,添加到本地视图或从本地视图中删除的实体也将
自动添加到上下文或从上下文中删除
因此,如果要访问元素,请始终使用Local
属性 您可以使用以下代码获取所有项目
foreach (var track in dbContext.ChangeTracker.Entries())
{
if (track.State == EntityState.Deleted)
Entity s = (Entity)track.OriginalValues.ToObject();
else
Entity s = (Entity)track.CurrentValues.ToObject();
}
我不想在编辑中间保存更改。嗯,除非保存更改,否则数据库不会更改。dbContext.Entities.Add(new Entity())只是暂存更改。需要明确的是:dbContext.Entities.ToArray()确实查询数据库,我认为所有其他不改变数据库的方法也是如此。.Add()、.Delete和(我认为)所有其他会改变数据库的方法都不会。那么,我如何才能从该集合中获取所有未保存的项和已保存的项?不确定,但您是否已尝试将State属性设置为.Added?(上面的第一行)。对不起,如果你不能,那是没有帮助的。启动项目、运行迁移和检查需要几分钟的时间。您是否尝试过context.Entities.Find(id)
?Entities
只是一个查询,ToArray()
将通过从数据库中提取来具体化查询(可能与一些本地缓存的结果合并)。在这种情况下,您的新实体没有在本地缓存,也没有保存到数据库中,所以它完全超出了结果?当我添加东西时,它们不会被缓存,那么如何保存它们呢?保存工作正常,但我只有在程序重新启动后才能保存。我需要立即添加新项。此处的缓存意味着之前已从数据库加载了某些项,或者您显式使用Attach
附加了一些新实体,但使用了一些现有键。当然,Attach
无法添加项。同样,实体
是一个从DbQuery
继承的DbSet
,它是一个查询,而不是集合。请参阅其他答案。我现在无法保存更改。我还没完成编辑工作。那么,如何从该集合中获取所有未保存的项目和已保存的项目?我已将代码更改为首先将所有记录加载到本地
集合中,然后从该集合中获取所有相关项目。我只是不应该忘记编写额外的.Local
,否则会导致意外行为Add
和Remove
仍然直接使用DbSet
。