The Operation Cannot Be Completed Because the Dbcontext Has Been Disposed Using MVC 4

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

This question & answer lead me to believe that IQueryable require an active context for its operation. That means you should try this instead:

try
{
IQueryable<User> users;

using (var dataContext = new dataContext())
{
users = dataContext.Users.Where(x => x.AccountID == accountId && x.IsAdmin == false);

if(users.Any() == false)
{
return null;
}
else
{
return users.Select(x => x.ToInfo()).ToList(); // this line is the problem
}
}

}
catch (Exception ex)
{
...
}

The operation cannot be completed because the DbContext has been disposed using MVC 4

The problem you're experiencing is due to LINQ's deferred execution. It's quite the gotcha for developers who haven't yet realized how LINQ works under the hood. I have a great blog post about it, but the core concept is that you must force an enumeration on the collection to cause the LINQ code to run immediately instead of later. This means changing this:

model.PublisherList = context.Publishers.Select(x =>
new SelectListItem()
{
Text = x.Name,
Value = x.Id.ToString()
});

to this:

model.PublisherList = context.Publishers.Select(x =>
new SelectListItem()
{
Text = x.Name,
Value = x.Id.ToString()
}).ToList();

Note the .ToList() there which forces the enumeration.

Your LINQ query is deferred meaning that it is not being run at your controller but instead afterwards, probably in your view where you loop over the collection (which forces the enumeration and thus runs the LINQ). Because you're using the using statement to dispose of your DB context (which is of course good practice), the context is disposed of before you reach the view, which executes the code against the disposed context. Forcing the enumeration within the using statement will run the code at that time, instead of later when the context is disposed, and prevent this issue.

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

The last line of InitializeAdmin disposes a context that is passed into the method.

Only dispose of objects that you have created, since you own the object's lifetime.

In other words, don't dispose of objects you don't own.

The operation cannot be completed because the DbContext has been disposed - MVC Asp.net Error:

The problem is in your GetUsers method. users = userContext.Users; code line gives you a query to operate on and when you try to use that query with users.Any() == false line you will get specified error, because your are trying to use UserContext after it is disposed (UserContext is disposed in the end of using block). Even if you use this line inside using block the returned IQuerable will be useless. Try to use Unit of Work and Repository patterns. You can follow this tutorial to learn more about that patterns. Initially it may seem long solution (or overkill) for a simple error, but once you get used to this, it is very convenient and flexible to use and you will save a lot of time by doing so in the long run.

operation cannot be completed because the DbContext has been disposed.

I think the problem is in those 2 lines

ViewBag.RoleId = new SelectList(db.Role, "Id", "Code");
ViewBag.Module = new SelectList(db.Module, "ModuleId", "ModuleName");

You are passing DbSets as IEnumerable to the SelectList constructor. If the constructor does not iterate the passed enumerable and just store it, then the DbContext goes out of scope and is disposed (due to using (var db = ...), and the ObjectDisposedException will be thrown anytime the DbSet enumerable is iterated.

I think you should make sure everything you use from the db context is materialized before disposing the context. For instance, adding ToList() or Select(...).ToList() like this

ViewBag.RoleId = new SelectList(db.Role.ToList(), "Id", "Code");
ViewBag.Module = new SelectList(db.Module.ToList(), "ModuleId", "ModuleName");

The operation cannot be completed because the DbContext has been disposed

Is context a field in your model?
I think you shouldn't assign to a field in a using statement. At the closing brace of the using context will be disposed. If you access that field in another place (without re-assigning) you are accessing a disposed object that might raise the exception you are getting.

Try changing your using statetments like this using (var context = new RecipeContext()).
(note var before context) and drop the field.

The operation cannot be completed because the DbContext has been disposed in mvc

I think that problem is related to registering types in IoC container. What IoC container are you using? How do you register CMSDataContext? Maybe you should use something like InstancePerRequest in AutoFac?

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

You can use DbContext again this way

using(var db = new ApplicationDbContext())
{
db.FixerIOs.Add(FixerIOInstance);
await db.SaveChangesAsync();
}


Related Topics



Leave a reply



Submit