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