我在webapi项目中遇到实体框架对象的问题。 从2-3天前一切正常,但现在,我打电话的api总是返回“Out of memory exception”。
最初我检查经典的“循环引用错误”,但事实并非如此。
在webapi配置中我有这个
config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.None;
config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.None;
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
要返回ef对象,我使用这样的函数
public Contatti GetContatto([FromUri]int id)
{
var db=new WebEntities();
return(db.Contatti.Single(x=>x.IDContatto == id));
}
有一种方法可以在带有webapi2的json响应中返回一个ef对象(及其子对象)吗?
答案 0 :(得分:0)
当我评论你的问题时,我并没有真正看到你发布的代码,但现在我做了一些评论:
始终调用dispose ,不要等待GC清除内存。虽然“内存不足”异常可能不是由此特定方法引起的,但您可能还没有处理其他(大)对象,如图像。因此,请检查您的代码并尽可能地处理对象。防止“内存不足”异常的最佳方法。
public Contatti GetContatto([FromUri]int id)
{
using(var db = new WebEntities())
{
return(db.Contatti.Single(x => x.IDContatto == id));
}
}
有没有办法在带有webapi2的json响应中返回一个ef对象(及其子对象)?
是的,但我建议不要返回EF对象,而是使用DTO 。省下了很多麻烦!
要返回EF对象,最好先取消对象:
protected internal T UnProxyItem<T>(T proxyObject) where T : class
{
var proxyCreationEnabled = this.Configuration.ProxyCreationEnabled;
try
{
this.Configuration.ProxyCreationEnabled = false;
return this.Entry(proxyObject).CurrentValues.ToObject() as T;
}
finally
{
this.Configuration.ProxyCreationEnabled = proxyCreationEnabled;
}
}