【问题标题】:Entity Framework return "$ref" items实体框架返回“$ref”项
【发布时间】:2015-05-20 07:06:33
【问题描述】:

我正在做我的功课——使用实体框架制作一个 web api 2 项目。

这是我的表格布局,在 Singer 和 Genre 表格之间具有 m-2-m 关系。

My Genre 是一个表格,我用它来按字母表获取我的歌手列表(因此 Genre 表格从 (ID: 1, Name: "A") 到 (ID: 26, Name: "Z")获取数据

现在我想让所有歌手都以“H”开头 (id=8)

public IQueryable<Singer> GetByGenre(int id)
    {            
        return db.Singers.Where(s => s.Genres.Any(g => g.ID == id));
    }

使用此查询:

http://localhost:6798/api/Singers/GetByGenre?id=8

但结果很奇怪 - 只显示第一个结果,而其他结果返回 "ref" ?我通过创建一个“假”列表来检查

var list = db.Singers.Where(s => s.Genres.Any(g => g.ID == id)).ToList();

并对其进行调试,它返回正确的 3 Singers ?

--

如您所见,我还有其他表(歌曲、播放列表、视频)有一个 FK 指向我的 Singer 的 ID,所以我怎样才能只返回 Singer 表的列(ID、NAME、IMAGE)而不返回所有其他关系数据(播放列表、歌曲、视频...)?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    为什么返回的json结果中包含$ref。

    Json 序列化器包含 $ref 来解决循环依赖。

    在此处查看有关此 Stackoverflow 答案的详细信息 -> Why is the Web Api returning empty json results with “$ref=”?

    如何只返回 Singer 表的列(ID、NAME、IMAGE)而不返回所有其他关系数据(播放列表、歌曲、视频...)?

    您需要在实体框架 dbcontext 中禁用延迟加载。

    类似这样的方式:

    db.Configuration.LazyLoadingEnabled = false;
    

    有关延迟加载和序列化程序的详细信息,请参阅this msdn 文章。

    【讨论】:

    • 谢谢!我查看了详细信息并关注this 并在虚拟属性上添加了[JsonIgnore] 属性,现在它可以工作了!
    • @user3448806 只是为了您的注意,它仅在 JSON 中序列化数据的情况下才有效。它不适用于 xml 数据传输。详情请查看this SO 线程。我建议您禁用延迟加载或该答案中建议的解决方案,而不是 [JsonIgnore] 属性。
    • 是的,但是我的 WP8 客户端应用程序也使用 Json 来反序列化结果,所以这对我来说很好。而且我还忘记了 1 个问题:我可以和更多列结果吗,即在这种情况下 - 我可以和歌手结果中的流派名称如:“ID:1,名称:Henry,流派:H,图像:。 .." ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2019-12-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多