Linq检测到循环参考

时间:2013-03-22 00:53:27

标签: c# json asp.net-mvc-3 linq

在下面收到此错误 试图建立关系,说1个帖子可以有多个postComments

  

在序列化System.Collections.Generic.List`1 [[DAO.Models.PostComment,DAO,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'类型的对象时检测到循环引用。

int userId = (int)Session["UserId"];
try
{
    IEnumerable<Post> userPosts;
    userPosts = (from q in db.Posts
                    where q.UserId == userId
                    && q.PostId > postid
                    select q).Take(5).ToList();


    return Json(userPosts.Select(x => new
    {
        success = 1,
        contenttext = x.PostContent,
        postId = x.PostId,
        comments = x.PostComments
    }), JsonRequestBehavior.AllowGet);

}
catch (Exception ex)
{
    return Json(new { success = 0 });

}
finally
{
    //db.Dispose();
}

我的帖子课程

public partial class Post
{
    public Post()
    {
        this.PostComments = new List<PostComment>();
    }

    public int UserId { get; set; }
    public int PostId { get; set; }
    public string PostContent { get; set; }        
    public virtual ICollection<PostComment> PostComments { get; set; }

    public partial class PostComment
    {
        public long PostCommentID { get; set; }
        public int PostId { get; set; }
        public int ParentCommentID { get; set; }
        public System.DateTime CommentDate { get; set; }
        public string Comment { get; set; }
        public virtual Post Post { get; set; }
    }   
}

2 个答案:

答案 0 :(得分:4)

Post课程中,您引用了PostComment,并在PostComment课程中再次引用了Post,这是循环引用发生的地方,您可以使用Json。 NET http://james.newtonking.com/pages/json-net.aspx并执行以下操作

JsonConvert.SerializeObject(myObject, Formatting.Indented, 
                            new JsonSerializerSettings { 
                                   ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
                            })

忽略引用循环处理,或者在序列化之前将其强制转换为匿名类。

答案 1 :(得分:0)

这意味着您的数据库中存在一些约束,这些约束必须引用某个表中的有效,并且此处有一个循环引用。它必须按照它们相互依赖的顺序更新行,但由于循环引用,这是不可能的。没有一行可以首先更新,以满足此时的数据库约束。