gpt4 book ai didi

c# - 第二次调用同一个 DbContext 导致错误 'DbContext has been disposed'

转载 作者:行者123 更新时间:2023-11-30 16:04:56 27 4
gpt4 key购买 nike

我想做什么

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); 行是导致此错误的行:

The operation cannot be completed because the DbContext has been disposed.

我看过类似问题的答案,建议使用 .ToList()(或其他东西来执行链接),但这种情况已经发生,因为 Get 返回一个 DTO 对象。

一些背景

保存中使用的 PersonManager,用它来设置 DbContext:

var context = new MyEntities();
this.PersonRepository = repositoryProvider.GetRepositoryByType<PersonRepository>(context);

var context = new MyEntities(); 只是让它现在工作,这将被 DI 注入(inject)。

这又取决于:

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(结果是相同的上下文),所以我不明白为什么它会在第二次调用时被处理掉。

最佳答案

您没有给出创建上下文的上下文,但我假设它在方法中,也许是构造函数中。您的上下文仅限于该方法,因此 GC 可以在方法调用结束时自由处理它。我认为它完全有效(即使只有一次)的事实是您设法在它被垃圾收集之前击中它。

具有讽刺意味的是,您的问题的发生是因为您还没有使用 DI。简单地注入(inject)它就足以解决问题。至少,您的上下文的范围应该与 PersonManager 相同。

关于c# - 第二次调用同一个 DbContext 导致错误 'DbContext has been disposed',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34289369/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com