C# 在EF core中,在一个类中添加实体后,如何在不调用SaveChanges()的情况下从其他类访问该实体?

C# 在EF core中,在一个类中添加实体后,如何在不调用SaveChanges()的情况下从其他类访问该实体?,c#,entity-framework,C#,Entity Framework,我有一个中等复杂的create操作,它在我正在处理的系统中被分解为多个部分。假设有3类: 操作或隔离器 EntityCreator 实体修改器 使用通过DI共享的数据库上下文实例(上下文的作用域为每个请求),编排器将调用创建者和修改器来建立复杂的对象和一系列关系,然后最终提交该操作 我的问题是,当EntityModifier试图访问通过EntityCreator创建的实体时,我遇到了一个“Sequence contains no elements”(序列不包含元素)异常。一些伪代码来说明:

我有一个中等复杂的create操作,它在我正在处理的系统中被分解为多个部分。假设有3类:

  • 操作或隔离器
  • EntityCreator
  • 实体修改器
使用通过DI共享的数据库上下文实例(上下文的作用域为每个请求),编排器将调用创建者修改器来建立复杂的对象和一系列关系,然后最终提交该操作

我的问题是,当EntityModifier试图访问通过EntityCreator创建的实体时,我遇到了一个“Sequence contains no elements”(序列不包含元素)异常。一些伪代码来说明:

public class OperationOrchestrator
{
   private IContext _context;
   private IEntityCreator _entityCreator, 
   private IEntityModifier _entityModifier

   public OperationOrchestrator(
       IContext context, 
       IEntityCreator entityCreator, 
       IEntityModifier entityModifier
   )
   {
      //boilerplate var assignment code
   }

   public void CreatePerson(string name, int age)
   {
       var id = _entityCreator.CreatePerson(name);
       _entityModifier.UpdatePersonAge(id, age);
       _context.SaveChanges();
   }
}

public class EntityCreator : IEntityCreator 
{
   private IContext _context;

   public EntityCreator (
       IContext context
   )
   {
      _context = context;
   }

   public Guid CreatePerson(string name)
   {
       var person = new Person {
          Id = Guid.NewGuid(),
          Name = name
       };

       _context.Add(person);
       return person.Id;

   }
}

public class EntityModifier : IEntityModifier
{
   private IContext _context;

   public EntityModifier (
       IContext context
   )
   {
      _context = context;
   }

   public void UpdatePersonAge(Guid id, int age)
   {
       var person = _context.People.Single(x => x.Id == id);
       person.Age = age;
   }
}
这里的问题调用位于
context.People.Single(x=>x.Id==Id)。上下文似乎没有将新的person添加到其People DbSet中,即使上下文的实例在不同的类中应该是相同的。最重要的是,如果我调试和检查局部变量,我可以在上下文的ChangeTracker中看到新创建的person

最后,如果在调用
context.People.Single(x=>x.Id==Id)之前,在
UpdatePersonAge()
方法中调用
SaveChanges()
,之后立即检索此人的尝试将成功

这是实体框架的预期设计,还是我可以设置一些配置选项来覆盖此行为


提前谢谢

这是根据以下内容设计的:

针对DbSet{tenty}的LINQ查询的结果将包含这些结果 从数据库返回,并且可能不会反映在未更改的上下文中所做的更改 已持久化到数据库。例如,结果将不包含新添加的实体 并且可能仍然包含标记为删除的实体

您可以首先在ChangeTracker中检查实体,然后如果其中没有实体,则可以转到db。这还将减少应用程序生成的查询量

public class EntityModifier : IEntityModifier
{
    private IContext _context;

    public EntityModifier(IContext context)
    {
        _context = context;
    }

    public void UpdatePersonAge(Guid id, int age)
    {
        var person = _context.ChangeTracker.Entries<Person>().SingleOrDefault(x => x.Id == id) ??
                     _context.People.Single(x => x.Id == id);
        person.Age = age;
    }
}
公共类实体修改器:IEntityModifier
{
私有IContext_上下文;
公共实体修改器(IContext上下文)
{
_上下文=上下文;
}
public void UpdatePersonAge(Guid id,int age)
{
var person=\u context.ChangeTracker.Entries().SingleOrDefault(x=>x.Id==Id)??
_context.People.Single(x=>x.Id==Id);
人。年龄=年龄;
}
}

您可能是EF缓存的受害者。尝试