Jon Harding
Jon Harding

Reputation: 4946

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection

enter image description here

I'm trying to query UserMetaData for a single record using the following query

 using (JonTestDataEntities context = new JonTestDataEntities())
            {
                return context.UserMetaData.Single(user => user.User.ID == id);               
            }

The error I'm receiving is: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. It is trying to lazyload Group for UserMetaData record. How can I change my query to prevent this error?

Upvotes: 0

Views: 1093

Answers (2)

Cory House
Cory House

Reputation: 15055

You need to create a strong type that matches the signature of your result set. Entity Framework is creating an anonymous type and the anonymous type is disposed after the using statement goes out of scope.

So assigning to a strong type avoids the issue altogether. I'd recommend creating a class called UserDTO since you're really creating a data transfer object in this case. The benefit of the dedicated DTO is you can include only the necessary properties to keep your response as lightweight as possible.

Upvotes: 1

user743382
user743382

Reputation:

As the message says, you cannot lazily load it after the function returns, because you've already disposed the context. If you want to be able to access Group, you can make sure you fetch it earlier. The extension method .Include(entity => entity.NavigationProperty) is how you can express this:

using (JonTestDataEntities context = new JonTestDataEntities())
{
    return context.UserMetaData.Include(user => user.Group).Single(user => user.User.ID == id);
}

Also consider adding .AsNoTracking(), since your context will be gone anyway.

Upvotes: 3

Related Questions