Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DbSet:缺少添加的项_C#_.net_Entity Framework - Fatal编程技术网

C# DbSet:缺少添加的项

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

在实体框架(6.1.3)的
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.Added

A有一个属性
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