Search code examples
c#.netnhibernatefluent-nhibernate

fluent nhibernate circular dependencies


I have 2 entities and everything works fine except NHibernate won't load the FieldGroupItems property in the second entity on an object. I suspect it's because there is a circular dependency between the 2 entities. I really need both ChildGroups and FieldGroupItems. If I remove ChildGroups than FieldGroupItems is loaded fine. Is there a way to have what I want. The only way I can think of is to use Guid collections instead of object collections to store only the Ids and fetch data manually from code. Any help is appreciated.

public class FieldGroupItemInstance : TenantBaseEntity
{
    public virtual Guid ItemId { get; set; }  //ID from the database to update actual object later
    public virtual bool IsTemporaryId { get; set; }  //true if field group is new (doesn't exist in system)
    public virtual IList<QuestionnaireInstanceField> Fields { get; set; }
    public virtual IList<QuestionnaireFieldGroupInstance> ChildGroups { get; set; }

    public FieldGroupItemInstance()
    {
        Fields = new List<QuestionnaireInstanceField>();
        ChildGroups = new List<QuestionnaireFieldGroupInstance>();
    }
}

public class QuestionnaireFieldGroupInstance : TenantBaseEntity
{
    public virtual Guid FieldGroupTemplateId { get; set; }
    public virtual IList<FieldGroupItemInstance> FieldGroupItems { get; set; } //Each repeated group of instances
    //public virtual FieldGroupItemInstance Parent { get; set; }

    public QuestionnaireFieldGroupInstance()
    {
        FieldGroupItems = new List<FieldGroupItemInstance>();
    }
}

Solution

  • If you are using fluentnhibernate to map your entities, this should work. Just pay attention to the Cascade options.

    public class FieldGroupItemInstanceMap() 
    {
            public FieldGroupItemInstanceMap()
            {
                    Table("FieldGroupItemInstance");
    
                    HasManyToMany(x => x.ChildGroups)
                            .Table("FieldGroupItemInstance_QuestionnaireFieldGroupInstance")
                            .ParentKeyColumn("IdFieldGroupItemInstance")
                            .ChildKeyColumn("IdQuestionnaireFieldGroupInstance")
                            .Cascade.None();
            }
    }
    
    public class QuestionnaireFieldGroupInstanceMap() 
    {
            public QuestionnaireFieldGroupInstanceMap()
            {
                    Table("QuestionnaireFieldGroupInstance");
    
                    HasManyToMany(x => x.FieldGroupItems)
                            .Table("FieldGroupItemInstance_QuestionnaireFieldGroupInstance")
                            .ParentKeyColumn("IdQuestionnaireFieldGroupInstance")
                            .ChildKeyColumn("IdFieldGroupItemInstance")
                            .Cascade.None();
            }
    }