【问题标题】:How do I prevent an MVC4 ApiController from serializing Entity Framework Navigation Properties?如何防止 MVC4 ApiController 序列化实体框架导航属性?
【发布时间】:2013-02-21 21:11:23
【问题描述】:

我有一个与实体框架对象一起使用的 ApiController。我试图在 GET 请求中返回的特定对象有近十几个导航属性。

当我返回 EF 对象列表时,它会序列化所有导航属性,这会导致序列化对象花费大量时间,

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

        return EFObject;

    }

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

我试过this,但没用。

【问题讨论】:

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


    【解决方案1】:

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

    当然是通过使用视图模型,然后让您的控制器操作返回此视图模型而不是您的域模型。视图模型将被专门定义为仅包含您想要的属性。您可能还会发现 AutoMapper 对于在域模型和视图模型之间进行映射很有用。

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

    【讨论】:

    • 这是我最初的想法,但我真的希望不必手动指定新类型中的所有属性。我会继续挖掘更多。
    【解决方案2】:

    你可以试试[XmlIgnore]属性。

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

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

    【讨论】:

    • 这非常有效。谢谢你。我做了你的 xml.UseXmlSerialize = true;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多