DbSet:缺少添加的项目

时间:2015-09-25 10:44:57

标签: 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

这怎么可能?当我在Visual Studio的即时窗口中查询dbContext.Entities时,它会显示“Local:Count = 4”之类的内容。为什么它会隐藏我的新物品?

更新:如果此系列没有做明显的事情 - 返回之前添加的内容 - 我需要做什么呢?它必须在首次调用时返回数据库中的所有记录,并且在以后调用时还必须包括所有更改(添加和删除)。只有在用户完成编辑后才会调用SaveChanges。之前需要收藏!当用户完成编辑时,也可能在介于两者之间的某处调用SaveChanges,但代码可能会返回,并且稍后会再次显示该视图。

4 个答案:

答案 0 :(得分:5)

DbSet有一个属性Local。这是包含所有元素的ObservableCollectionDbSet对象本身仅代表对数据库的查询。

来自Local属性的文档:

  

获取一个ObservableCollection,它表示所有的本地视图   此集合中添加,未更改和已修改的实体。这种本地观点   将在上下文中添加或删除实体时保持同步。   同样,添加到本地视图或从本地视图中删除的实体将   自动添加到上下文中或从上下文中删除。

因此,如果要访问元素,请始终使用Local属性来执行此操作。

答案 1 :(得分:2)

添加新实体后,您必须使用dbContext对象保存更改,使用 dbContext.SaveChanges();或dbContext.EntityState.Added

答案 2 :(得分:0)

您必须保存更改。试试

dbContext.State = EntityState.Added;
dbContext.SaveChanges();

答案 3 :(得分:0)

您可以使用以下代码获取所有项目

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();
}