Webapi2返回ef对象

时间:2017-02-09 14:54:59

标签: c# entity-framework

我在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对象(及其子对象)吗?

1 个答案:

答案 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;
        }
    }