我想要做的事情
public void SomeTestMethod(){
var person = this.PersonManager.Get(new Guid("someguid"));
person.Lastname = "Jameson";
this.PersonManager.Save(person); // This goes wrong
}
出现问题的地方
以上保存方法调用了以下代码:
protected void Add<T>(T source, MyEntities context, bool isNew) where T : class
{
if (isNew)
{
context.Set<T>().Add(source);
}
else
{
var entry = context.Entry(source);
if (entry.State == EntityState.Detached)
{
context.Set<T>().Attach(source);
entry.State = EntityState.Modified;
}
}
}
var entry = context.Entry(source);
这一行导致了这个错误:
无法完成操作,因为DbContext已被释放。
我看到类似问题的答案建议使用 .ToList()
(或其他执行链接的方法),但是这样做不起作用,因为 Get
返回一个DTO对象。
一些背景
在保存时使用的 PersonManager
,使用以下代码设置DbContext:
var context = new MyEntities();
this.PersonRepository = repositoryProvider.GetRepositoryByType<PersonRepository>(context);
< p > var context = new MyEntities();
只是为了使其现在可用,这将被 DI 注入。
这又取决于以下内容:
public T GetRepositoryByType<T>(MyEntities context) where T : IContextDependent
{
var instance = this.Repositories.SingleOrDefault(x => x is T);
instance.SetContext(context);
return (T)instance;
}
由于使用的是同一个PersonManager
,实际上使用的是同一个PersonRepository
(因此使用相同的上下文),所以我不明白为什么在第二次调用时它会被释放。
PersonRepository
吗? - Alexander Derck