Entity With EntityState.在IRepository. findall()中增加了不返回
本文关键字:增加 返回 findall EntityState With IRepository Entity | 更新日期: 2023-09-27 18:06:08
我正在开发一个小应用程序,它允许用户创建单词列表,并且用户能够为列表提供名称。我设置程序以利用工作单元模式。我希望用户能够做出他们想要的所有CRUD更改,然后当用户准备好更新数据库时,单击"保存更改"按钮来执行Context.SaveChanges()并进行所有更改。
我正在使用实体框架与存储库&启用了延迟加载的工作单元模式。list类和word类都是映射到数据模型的poco,而数据模型又映射到数据库。
My Add Code:
_unitOfWork.ListRepository.Add(newList);
ListRepository。添加方法:
public void Add(T newEntity)
{
_objectSet.AddObject(newEntity);
}
后来我得到一个InvalidOperationException消息:Sequence包含没有元素。
_unitOfWork.ListRepository.Find(l => l.Name == currentName).Single();
我知道为什么我得到那个异常,因为我应该使用SingleOrDefault()是安全的。然而,我知道我正在寻找的实体存在于上下文的某个地方。我猜我没找对地方。
问题来了(或者说我的知识不足):
在调试期间,我在上面的_unitOfWork.ListRepository.Add(newList)代码中放置了一个断点。在Step-Over之后,我切换到即时窗口,得到了以下内容:
?_unitOfWork.ListRepository.FindAll().Count();
1
"1"应该是"2"
listposiitory . findall()方法:
public IQueryable<T> FindAll()
{
return _objectSet;
}
我已经跟踪了我的代码,我只初始化我的_unitOfWork对象一次。我在存储库中公开了ObjectSet.Context.ObjectStateManager,当异常助手在调试中出现时,我可以转到立即窗口并执行:
_unitOfWork.ListRepository.GetObjectStateManager()
.GetObjectStateEntries(EntityState.Added).Count();
1
所以,我知道实体在那里,但我不确定如何使用_unitOfWork或ListRepository对象来获取它。如果有任何帮助,我将不胜感激,或者请给我指出正确的方向。
谢谢。
这就是EF的行为。您的Find
和FindAll
访问ObjectSet
实例。这将总是对数据库进行查询——它对创建的实体不做任何事情,并且还没有插入到数据库中,它们不能作为返回结果的一部分。
要获得尚未持久化的实体,必须在ObjectStateManager
中搜索。您可以将其添加到存储库中,以允许搜索单个实体。它将首先搜索EF内部存储,如果找不到实体,它将搜索数据库:
private T SearchStateManager(Expression<Func<T, bool>> searchCriteria)
{
return _context.ObjectStateManager.GetObjectStateEntries(~EntityState.Detached)
.Where(e => !e.IsRelationship)
.Select(e => e.Entity)
.OfType<T>()
.SingleOrDefault(searchCriteria.Compile());
}
public T Single(Expression<Func<T, bool>> searchCriteria)
{
T entity = SearchStateManager(searchCriteria);
if (entity == null)
{
entity = _objectSet.SingleOrDefault(searchCriteria);
}
return entity;
}