I am attempting to retrieve a list of objects from Entity Framework via WCF, but am receiving the following exception:
There was an error while trying to serialize p
You have several other options other than adding no proxy to your entire POCO:
1) Create a wrapper/DTO. In an API, it is likely that you don't want to expose the whole POCO to your users... so create a wrapper object that only exposes the stuff you want, and this also solves the proxy problem.
1.5) Pretty much like 1, but instead of creating a wrapper, just return an anonymous type (with LINQ)
2) If you don't need to do it app wide, it may make more sense to do it in the Controller where you need that serialization... or even more localized to a Method, including using, here's a per Controller implementation:
public class ThingController : ApiController
{
public ThingController()
{
db = new MyContext();
db.Configuration.ProxyCreationEnabled = false;
}
private MyContext db;
// GET api/Thing
public IQueryable GetThings()
{
return db.Things;
}
//...
protected override void Dispose(bool disposing)
{
if (disposing)
db.Dispose();
base.Dispose(disposing);
}
}
3) The other thing is if you're needing it just for that db call, the easiest way to do it is to chain AsNoTracking() into your call:
List things;
using (var db = new MyContext())
{
things = db.Things.AsNoTracking().ToList();
}