- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个直接调用的 Controller 操作,但抛出了这个错误:
The operation cannot be completed because the DbContext has been disposed.
我只在网上找到了有关延迟执行的解决方案,但我认为这不适用于此处,因为我在任何地方使用上下文(在本例中)我都调用 .ToList()
或 .FirstOrDefault()
。这是我的代码:
Controller 内容
private IUnitOfWork UnitOfWork;
public MyFavouritesController(
IAccountServices accountServices,
IUnitOfWork unitOfWork
)
{
AccountServices = accountServices;
UnitOfWork = unitOfWork;
}
public ActionResult Index()
{
int? id = AccountServices.GetCurrentUserId();
if (!id.HasValue)
{
return RedirectToAction("Login", "Account", new { ReturnUrl = this.HttpContext.Request.Url.AbsolutePath });
}
var user = UnitOfWork.UserRepo.Get(id.Value, "Favourites", "Favourites.County", "Favourites.Country");
//THE ABOVE CALL GETS THE ERROR
//.....
return View();
}
存储库基类
public class RepositoryBase<C, T> : IDisposable
where C:DbContext, new()
where T : ModelBase
{
private DbContext _context;
public DbContext Context
{
get
{
if (_context == null)
{
_context = new C();
this.AllowSerialization = true;
}
return _context;
}
set
{
_context = value;
}
}
public virtual T Get(int Id, params string[] includes)
{
if (Id > 0)
{
var result = Context.Set<T>().Where(t => t.Id == Id);
foreach (string includePath in includes)
{
result = result.Include(includePath);
}
return result.FirstOrDefault(); //This is where the error occurs.
}
else
{
throw new ApplicationException("Id is zero (0).");
}
}
//... (More CRUD methods)
public void Dispose()
{
if (Context != null)
{
Context.Dispose(); //Debugger never hits this before the error
}
}
}
工作类单元
public class UnitOfWork:IUnitOfWork
{
public UnitOfWork(
//... DI of all repos
IUserRepository userRepo
)
{
//... save repos to an local property
UserRepo = userRepo;
//create a new instance of the context so that all the repo's have access to the same DbContext
Context = new Context();
//assign the new context to all the repo's
//...
UserRepo.Context = Context;
}
public Context Context { get; set; }
public IUserRepository UserRepo { get; set; }
//... (some more repositories)
public void Dispose()
{
Context.Dispose(); //THIS IS NOT HIT AT ALL
}
}
最后,模型容器有这条线
_Instance.RegisterType<IUnitOfWork, UnitOfWork>(new PerThreadLifetimeManager());
如您所见,索引操作将接收一个新的 UnitOfWork 实例,其中包含一个新的 DbContext 对象。但是在第一次调用此上下文时,它会抛出上述错误。这种模式适用于我的代码中的任何其他地方。
谢谢
更新
下面的答案是使用 perRequestLifetimeManager。下面是 one in unity 的实现:
public class HttpRequestLifetimeManager : LifetimeManager
{
private string _key = Guid.NewGuid().ToString();
public override object GetValue()
{
if (HttpContext.Current != null && HttpContext.Current.Items.Contains(_key))
return HttpContext.Current.Items[_key];
else
return null;
}
public override void RemoveValue()
{
if (HttpContext.Current != null)
HttpContext.Current.Items.Remove(_key);
}
public override void SetValue(object newValue)
{
if (HttpContext.Current != null)
HttpContext.Current.Items[_key] = newValue;
}
}
最佳答案
我注意到您正在使用 PerThreadLifetimeManager
来控制您的工作单元类的创建和处置。如果您的 IoC 容器支持,您可能应该将其更改为类似 PerRequestLifetimeManager
的内容。
关于c# - EF4.1 代码优先 DbContext : The operation cannot be completed because the DbContext has been disposed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12424997/
我有一个返回 future 的函数,该函数取决于要解决的回调结果: Future connectSocket(String email, String password, {Function o
我正在尝试链接两个返回 Completable 的响应式调用在 android 上使用改造: val userRequest = ... val languageRequest = ... retur
我正在尝试将一些数据保存在数据库中。对于添加方法,我使用 Completable。在我保存一个实体 - 客户之后,我想保存一个天数列表,但只有在客户被保存之后。这是我现在的代码。 mDatabaseM
我是 RxJava 的新手,遇到了以下问题: 我有两个 Completable 对象来存储一些数据。我想触发第一个,然后仅在第一个成功完成后才启动第二个。对第二个 Completable 的调用应该被
我正在尝试从两个不同的文件中读取数据,一个是 csv 格式,另一个文件是 xml 数据。使用completeFuture 我正在尝试从两个文件异步读取数据。我收到类型转换错误。请让我知道我是否遵循正确
我有以下人员类别: class Person { String name; String city; public void setInfo(PersonInformation
我正在尝试这个: var notifications = $( "#notifications" ); notifications.fadeOut("slow") .complete(func
我发现 Bash shell 支持一种不同于“传统”自动完成的自动完成类型,所有可能性都列在下一行。 使用“传统的”自动完成,如果我键入 ch 然后按 Tab 键,我会得到如下信息: $ ch cha
我是 rxjava/rxkotlin/rxandroid 的初学者。 我需要按顺序处理三个不同的异步调用。问题是第一步返回 Single ,第二个Completable第三个又是Completable
默认情况下,在 TextMate 中按 Esc 会循环执行可能的补全(除了关闭对话框之外),这可能会在文档中放入不需要的字符,特别是如果您习惯于在大多数文本编辑器中使用 Esc 作为安全键的话。 (事
我知道 pull complete 在之后到达 download complete 在生命周期中,但我有兴趣了解它们之间的区别。我尝试在互联网上搜索,但找不到任何清楚解释这些差异的内容。 最佳答案 拉
以下代码似乎永远不会工作,因为组似乎没有终止,并且 takeLast() 不知道最后是什么: observableSequence .groupBy { $0.key } .map { gro
我是 ido-mode 的忠实粉丝,以至于我想用它来做 describe-function 之类的事情或 find-tag等等,而无需编写类似“我可以在 Emacs 中搜索标签的 ido-mode-s
我们什么时候应该使用 Completable.fromAction()我们什么时候应该使用 Completable.fromCallable()是否有特定的用例 从文档看来,两者都做同样的事情,很难注
我有以下gulpfile.js,我通过命令行执行gulp消息: var gulp = require('gulp'); gulp.task('message', function() { cons
我在我的 .vimrc 文件中设置了 omnifuc : setlocal omnifunc = javacomplete#complete 然后当我编辑任何文件时出现异常: E518: Unknow
我如何将 Single 链接到 Completable,以便在 Completable 完成时订阅它? repository.downloadUser() 是 Single。 根据调试,似乎此方法中的
在bash中,默认情况下,按Tab键将显示当前目录中的所有文件和目录。例如:。Cat a将显示类似aFile.txt apples.png aDirectory/的内容。如果您随后完成了a目录,它将显
在bash中,默认情况下,按Tab键将显示当前目录中的所有文件和目录。例如:。Cat a将显示类似aFile.txt apples.png aDirectory/的内容。如果您随后完成了a目录,它将显
我错过了什么?示例使用 min.js。 bundle.min.js 有更多代码,但我找不到该额外代码的描述...... https://getbootstrap.com/docs/4.0/gettin
我是一名优秀的程序员,十分优秀!