Search code examples
c#entity-frameworkentity-framework-6jsonserializer

How to serialize into a json from entity?


I'm trying to serialize an (Entity Framework 6) entity into json. I am making sure the entry is in memory before serializing via the AsNoTracking() method however I get an error as it cant receive a value form a different table that is referenced in the entry.

Inner Exception: When an object is returned with a NoTracking merge option, Load can only be called when the EntityCollection or EntityReference does not contain objects.

Exception: JsonSerializationException:  Error getting value from 'TABLE_X' on 'System.Data.Entity.DynamicProxies....

Code:

List<Location> locations = new DbContext().Locations.Where(x => x.Type == 1).Take(5).AsNoTracking().ToList();
string s = JsonConvert.SerializeObject(locations, new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });

All I want to do is return a string of the serialized entity. Im not worried about other objects, solely the locations entity.

When I tried disposing of the connection and then json serializing I received the error: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

I only want to serialize my list, I do not want to return/serialize any foreign dependencies.


Solution

  • This an EF's dynamic proxy issue you have to disable it to have your code working

    in your class that inherit from DbContext

    public class MyModelEntities : DbContext
    {
       public MyModelEntities()
       {
          //just disable it like this  
          Configuration.ProxyCreationEnabled = false;
       }
    }
    

    Mainly what's happening is that your JsonConvert is trying to serialize an object like this System.Data.Entity.DynamicProxies.Location_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6

    due to the proxy, which cannot be found because it's dynamically created