如何将延迟加载的复杂对象返回到Web API

时间:2013-08-22 16:58:42

标签: json entity-framework asp.net-web-api

我正在创建一个Web API来公开实体框架模型。

在我读过的一些帖子之后,我在webapi.config文件中做了几个帖子

//Ignore circular references due to the VIRTUAL property on some objects.
        GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

//Remove XML formatter. We dont need XML, just JSON.
        config.Formatters.Remove(config.Formatters.XmlFormatter);

DefaultContractResolver resolver = (DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver;
        resolver.IgnoreSerializableAttribute = true;

在我的Web API控制器中,我在数据库上下文中禁用了ProxyCreation。

通常这是我需要的。然而。我需要返回一个具有虚拟UserAdditionalInfos属性的UserProfile对象,如下所示。

[Serializable]
public class UserProfile
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int UserId { get; set; }

    public virtual List<UserAdditionalInfos> AdditionalDetails { get; set; }
}

如果我尝试进行API调用以获取UserProfile对象,则在尝试延迟加载UserAdditionalInfos列表时会出现错误。我期待这一点,因为我关闭了代理创建。但是如果我重新打开它,我会得到一个在JSON中返回的代理编码字符串,而不是我想要的对象。

如果没有为我的API手动创建“平面”对象,是否有可用的可靠解决方法?我确定这是一个常见的问题吗?

干杯

1 个答案:

答案 0 :(得分:0)

好的,我设法解决了这个问题,但在我的界面中添加了一个可选的'Includes'字符串,然后我将其拆分并分离并应用于查询本身。感谢所有人的洞察力!