如何阻止MVC4 ApiController序列化实体框架导航属性?

时间:2013-02-21 21:11:23

标签: c# asp.net-mvc entity-framework serialization asp.net-mvc-4

我有一个与Entity Framework对象一起使用的ApiController。我试图在GET请求上返回的特定对象有几十个导航属性。

当我返回EF对象列表时,它会序列化所有导航属性,这会导致序列化对象的时间过长,

    public IEnumerable<EFObject> Get()
    {
        IEnumerable<EFObject> EFObjects=
            db.EFObject;

        return EFObject;

    }

如何阻止MVC序列化这些导航属性?

我已经尝试了this但它没有用。

2 个答案:

答案 0 :(得分:2)

  

如何阻止MVC序列化这些导航属性?

通过使用视图模型然后让控制器操作返回此视图moedl而不是域模型。视图模型将专门定义为仅包含所需的属性。您可能还会发现AutoMapper对于您的域模型和视图模型之间的映射非常有用。

最佳做法是始终从您的方法公开视图模型,并且永远不要让您的域实体在这些方法之外可见。从这种方法中获得的另一个好处是,您的API可以适应您的域模型中的变化,这可以在不破坏现有客户端的情况下完成。

答案 1 :(得分:1)

您可以尝试[XmlIgnore]属性。

很大程度上取决于技术堆栈的其他部分等。我正在使用WebApi并在WebApiConfig.cs文件中使用此代码并忽略导航属性。我总是返回xml,而不是json。

var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
xml.UseXmlSerializer = true;