【问题标题】:"Circular Reference" exception when serializing database object序列化数据库对象时出现“循环引用”异常
【发布时间】:2014-04-25 23:57:47
【问题描述】:

我收到一条错误消息,指出在序列化类型对象时检测到循环引用。我相信这与我的数据库以及我的 PK 和 FK 设置有关。

    public string GetSongs(int playlistId)
    {
        var songs = (from song in _db.Songs where song.PlaylistId == playlistId select song).ToList();
        var serializer = new JavaScriptSerializer();
        var json = serializer.Serialize(songs); // ERROR MESSAGE HERE
        return json;
    }

这是我的数据库架构的图片:

【问题讨论】:

  • 虽然这不是一个答案:考虑直接公开数据库模型。拥有一个单独的对象图(并映射到此类)将避免这个问题,并提供更细粒度/灵活的响应结果。

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


【解决方案1】:

如果您首先使用代码,请避免使用 Playlist 模型中的 User 属性中的 virtual 关键字和 Song 模型中的 Playlist。 因为Playlist 自动加载您的User 模型,因此您的Playlist 又是User 并且循环继续。

【讨论】:

  • 我刚刚尝试删除 virtual 关键字,但仍然有同样的错误
  • 然后从 Song 模型中删除虚拟形式的 Playlist 属性
【解决方案2】:

你有非常个循环引用。你的UsersPlayLists,每个PlayList 有一个用户,还有一个Songs 列表,每个都在PlayList 中。

  1. 要序列化User 1,您必须序列化PlayList 1
  2. 要序列化PlayList 1,你必须序列化它的User,也就是User 1
  3. 要序列化User 1,您必须序列化PlayList 1

等等

正如其他地方所述,解决方案是不直接公开您的数据模型。您要序列化的是包含外键的内容,而不是对实体框架模型的引用。所以你的UserDTO 对象可能包含一个ID、用户名、密码和一个播放列表ID 列表,而不是PlayList 列表。每个PlayListDTO 将包含一个Id、UserId 和一个SongId 列表等。

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 2016-10-02
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多