StackOverflowException when object is Self-recursive

Dec 15, 2009 at 5:34 PM

Emit Mapper throws StackOverflowException when mapping self-recursive objects like:

 

 public partial class CategoryEntity : global::System.Data.Objects.DataClasses.EntityObject
    {
        /// <summary>
        /// Create a new CategoryEntity object.
        /// </summary>
        /// <param name="categoryID">Initial value of CategoryID.</param>
        /// <param name="name">Initial value of Name.</param>
        public static CategoryEntity CreateCategoryEntity(int categoryID, string name)
        {
            CategoryEntity categoryEntity = new CategoryEntity();
            categoryEntity.CategoryID = categoryID;
            categoryEntity.Name = name;
            return categoryEntity;
        }
        /// <summary>
        /// There are no comments for Property CategoryID in the schema.
        /// </summary>
        [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
        [global::System.Runtime.Serialization.DataMemberAttribute()]
        public int CategoryID
        {
            get
            {
                return this._CategoryID;
            }
            set
            {
                this.OnCategoryIDChanging(value);
                this.ReportPropertyChanging("CategoryID");
                this._CategoryID = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value);
                this.ReportPropertyChanged("CategoryID");
                this.OnCategoryIDChanged();
            }
        }
        private int _CategoryID;
        partial void OnCategoryIDChanging(int value);
        partial void OnCategoryIDChanged();
        /// <summary>
        /// There are no comments for Property Name in the schema.
        /// </summary>
        [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable=false)]
        [global::System.Runtime.Serialization.DataMemberAttribute()]
        public string Name
        {
            get
            {
                return this._Name;
            }
            set
            {
                this.OnNameChanging(value);
                this.ReportPropertyChanging("Name");
                this._Name = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false);
                this.ReportPropertyChanged("Name");
                this.OnNameChanged();
            }
        }
        private string _Name;
        partial void OnNameChanging(string value);
        partial void OnNameChanged();
        /// <summary>
        /// There are no comments for SubCategories in the schema.
        /// </summary>
        [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Model", "FK_Categories_Categories", "Categories1")]
        [global::System.Xml.Serialization.XmlIgnoreAttribute()]
        [global::System.Xml.Serialization.SoapIgnoreAttribute()]
        [global::System.Runtime.Serialization.DataMemberAttribute()]
        public global::System.Data.Objects.DataClasses.EntityCollection<CategoryEntity> SubCategories
        {
            get
            {
                return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection<CategoryEntity>("Model.FK_Categories_Categories", "Categories1");
            }
            set
            {
                if ((value != null))
                {
                    ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection<CategoryEntity>("Model.FK_Categories_Categories", "Categories1", value);
                }
            }
        }
        /// <summary>
        /// There are no comments for ParentCategory in the schema.
        /// </summary>
        [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Model", "FK_Categories_Categories", "Categories")]
        [global::System.Xml.Serialization.XmlIgnoreAttribute()]
        [global::System.Xml.Serialization.SoapIgnoreAttribute()]
        [global::System.Runtime.Serialization.DataMemberAttribute()]
        public CategoryEntity ParentCategory
        {
            get
            {
                return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<CategoryEntity>("Model.FK_Categories_Categories", "Categories").Value;
            }
            set
            {
                ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<CategoryEntity>("Model.FK_Categories_Categories", "Categories").Value = value;
            }
        }
        /// <summary>
        /// There are no comments for ParentCategory in the schema.
        /// </summary>
        [global::System.ComponentModel.BrowsableAttribute(false)]
        [global::System.Runtime.Serialization.DataMemberAttribute()]
        public global::System.Data.Objects.DataClasses.EntityReference<CategoryEntity> ParentCategoryReference
        {
            get
            {
                return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<CategoryEntity>("Model.FK_Categories_Categories", "Categories");
            }
            set
            {
                if ((value != null))
                {
                    ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference<CategoryEntity>("Model.FK_Categories_Categories", "Categories", value);
                }
            }
        }
        /// <summary>
        /// There are no comments for Companies in the schema.
        /// </summary>
        [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Model", "FK_Companies_Categories", "Companies")]
        [global::System.Xml.Serialization.XmlIgnoreAttribute()]
        [global::System.Xml.Serialization.SoapIgnoreAttribute()]
        [global::System.Runtime.Serialization.DataMemberAttribute()]
        public global::System.Data.Objects.DataClasses.EntityCollection<CompanyDetailsEntity> Companies
        {
            get
            {
                return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection<CompanyDetailsEntity>("Model.FK_Companies_Categories", "Companies");
            }
            set
            {
                if ((value != null))
                {
                    ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection<CompanyDetailsEntity>("Model.FK_Companies_Categories", "Companies", value);
                }
            }
        }
    }
 public partial class CategoryEntity : global::System.Data.Objects.DataClasses.EntityObject
    {
....

        public global::System.Data.Objects.DataClasses.EntityCollection<CategoryEntity> SubCategories
        {
            get
            {
..
            }
            set
            {
..
            }
        }

    }

to 

 

 

  public class Category
    {
        ...
        
	public Category[] SubCategories { get; set; }
	...
    }

 

 

 

Coordinator
Dec 15, 2009 at 10:22 PM
Edited Dec 19, 2009 at 9:02 PM

Hi pakrym, thanks for the bugreport. It will be fixed soon. As workaround you can use a custom converter with submapper.

 

 

Coordinator
Dec 19, 2009 at 8:57 PM

The bug has been fixed