在实体框架(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
,但代码可能会返回,并且稍后会再次显示该视图。
答案 0 :(得分:5)
DbSet
有一个属性Local
。这是包含所有元素的ObservableCollection
。 DbSet
对象本身仅代表对数据库的查询。
来自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();
}