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对象来获取它。如果有任何帮助,我将不胜感激,或者请给我指出正确的方向。

谢谢。

Entity With EntityState.在IRepository<T>. findall()中增加了不返回

这就是EF的行为。您的FindFindAll访问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;
}