C# EntityState为的实体。已添加但未在IRepository中返回<;T>;。芬德尔()

C# EntityState为的实体。已添加但未在IRepository中返回<;T>;。芬德尔(),c#,entity-framework,repository-pattern,unit-of-work,C#,Entity Framework,Repository Pattern,Unit Of Work,我正在开发一个小应用程序,它允许用户创建一个单词列表,用户可以为列表提供一个名称。我设置程序以利用工作单元模式。我希望用户能够进行他们想要的所有CRUD更改,然后当用户准备好更新数据库时,单击“保存更改”按钮执行Context.SaveChanges()并进行所有更改 我正在使用实体框架和存储库&启用延迟加载的工作单元模式。list和word类都映射到一个数据模型,该数据模型又从数据库映射而来 我的添加代码: _unitOfWork.ListRepository.Add(newList); L

我正在开发一个小应用程序,它允许用户创建一个单词列表,用户可以为列表提供一个名称。我设置程序以利用工作单元模式。我希望用户能够进行他们想要的所有CRUD更改,然后当用户准备好更新数据库时,单击“保存更改”按钮执行Context.SaveChanges()并进行所有更改

我正在使用实体框架和存储库&启用延迟加载的工作单元模式。list和word类都映射到一个数据模型,该数据模型又从数据库映射而来

我的添加代码:

_unitOfWork.ListRepository.Add(newList);
ListRepository.Add方法:

public void Add(T newEntity)
{
    _objectSet.AddObject(newEntity);
}
稍后,我得到一个InvalidOperationException消息:Sequence不包含任何元素

_unitOfWork.ListRepository.Find(l => l.Name == currentName).Single();
我知道为什么会出现这种异常,因为我应该使用SingleOrDefault()来确保安全。然而,我知道我要寻找的实体存在于上下文中的某些地方。我猜我找的地方不对

问题是(或我缺乏知识):

在调试期间,我在上面的_unitOfWork.ListRepository.Add(newList)代码上放置了一个断点。经过一步之后,我走到直接窗口并执行了操作,得到了以下信息:

?_unitOfWork.ListRepository.FindAll().Count();
1
“1”应该是“2”

ListRepository.FindAll()方法:

因此,我知道实体在那里,但我不确定如何使用_unitOfWork或ListRepository对象获取它。任何帮助都将不胜感激,或者请为我指出正确的方向


谢谢。

这就是英孚的表现。您的
Find
FindAll
access
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;
}
private T SearchStateManager(表达式搜索条件)
{
返回_context.ObjectStateManager.GetObjectStateEntries(~EntityState.Detached)
.其中(e=>!e.IsRelationship)
.选择(e=>e.Entity)
第()类
.SingleOrDefault(searchCriteria.Compile());
} 
公共T单(表达式搜索条件)
{
T实体=SearchStateManager(searchCriteria);
if(实体==null)
{
实体=_objectSet.SingleOrDefault(搜索条件);
}
返回实体;
}

终于有时间回到这个话题上了。谢谢你的回答,工作完美!现在做些调查来了解发生了什么。@Ladislav:尊敬!你在这些问题上无处不在。你对这件事了解得真是太多了!
_unitOfWork.ListRepository.GetObjectStateManager()
    .GetObjectStateEntries(EntityState.Added).Count();
1
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;
}