Entity Framework 的导航属性怎么序列化?我记得以前写的程序是正确的,今天发现出错了,也不知道什么时候开始出错的。一个投票主题的实体类,里面包含了投票选择的实体类集合。原先意图是一次就能返回需要的主从表数据。有些地方要用ajax 加载界面,把实体类序列化的时候报告,重复引用using (Entities db = new Entities())
            { 
                var q = from x in db.TopWinCMS_Vote.Include("VoteChoiceInfo")
                        where x.ID == id && x.Pass == 1
                        select x;
                return q.FirstOrDefault();
            }
 [DataContractAttribute]
public partial class VoteInfo
    {
        public VoteInfo()
        {
            this.VoteChoiceInfo = new HashSet<VoteChoiceInfo>();
        }
    
        [DataMember]
     public int ID { get; set; }
        [DataMember]
     public string Title { get; set; }
        [DataMember]
     public int Pass { get; set; }
        [DataMember]
     public System.DateTime CheckInTime { get; set; }
        [DataMember]
     public int VoteType { get; set; }
        [DataMember]
     public string PicUrl { get; set; }
        [DataMember]
     public System.DateTime EndData { get; set; }
        [DataMember]
     public string windowsize { get; set; }
        [DataMember]
     public string TemplateFileName { get; set; }
        [DataMember]
     public int LimitIP { get; set; }
    
        [DataMember]
public   ICollection<VoteChoiceInfo> VoteChoiceInfo { get; set; }
    } [DataContractAttribute]
public partial class VoteChoiceInfo
    {
        [DataMember]
     public int ID { get; set; }
        [DataMember]
     public string ChoiceTitle { get; set; }
        [DataMember]
     public int VoteNum { get; set; }
        [DataMember]
     public string PicUrl { get; set; }
        [DataMember]
     public int IsDefault { get; set; }
        [DataMember]
     public int VoteID { get; set; }
        [DataMember]
     public int OrderID { get; set; }
    
        [DataMember]
public virtual VoteInfo VoteInfo { get; set; }
    }由此可见 VoteInfo 里面包含VoteChoiceInfo ,VoteChoiceInfo 里面包含VoteInfo 。
经断点可以看到,查询出来的实体类是无限递归下去。序列化的时候报
““TopWinCMS.Model.VoteChoiceInfo”类型的对象图包含循环,如果禁用引用跟踪,择无法对其进行序列化。”

解决方案 »

  1.   

    用什么序列化的?DataContractSerializer 的话构造的时候把preserveObjectReferences设置为true
    参考http://blogs.msdn.com/b/sowmy/archive/2006/03/26/561188.aspx
      

  2.   

    序列化成xml 已经搞定了。
    DataContractSerializer serializer = new DataContractSerializer(typeof(T), typeof(T).Name, string.Empty, null, int.MaxValue, false, true, null, null);序列化成json还没弄好 DataContractJsonSerializer没类似选项
      

  3.   

    现在是临时解决问题。把子类里面的引用父类的属性设置为私有。这样避免序列化的时候父子,子父,父子循环引用。因为实体类是由entity 生成的,下次修改模型还得被覆盖修改过的代码。
      

  4.   

    怎么不按引用传递
    [DataContract(IsReference = true)]