двунаправленное отображение - PullRequest
1 голос
/ 23 июля 2011

Учитывая приведенную ниже объектную модель, отображение и код, я хочу добиться следующего:

НА ЭКОНОМ

новых родительских объектов Party, я бы хотел, чтобы родитель сохранил также дочерние PartyNames. ТАК в идеале я могу просто сделать:

var party = new Party();
party.AddPartyName(_developerName)
using(var tx = session.BeginTransaction){
    _session.Save (party);
    tx.Commit()
}

Но мое понимание из последнего вопроса, который я задал по этому , заключается в том, что, хотя это можно сделать с помощью inverse = "false", я действительно хочу определить набор дочерних элементов, используя inverse = "true", что после Сохранение партии Мне нужно явно сохранить каждого ребенка:

        foreach (var name in party.Names{ _session.Save(name)}

ниже говорится, что у Партии и Партийного имени есть отношение много к одному. Я думаю, что каскад = все, что должно быть в Party.hbm, должно иметь NHib, кроме дочерних имен PartyName.

При получении

То, что я действительно хочу сделать, это просто:

IList<Party> found;
using(var tx = _session.BeginTransaction())}
    found = _session.QueryOver<T>().List());
    tx.Commit()
}

Я хочу, чтобы PartyNames были увлажнены, но это не так.

Итак, как мне улучшить отображение / код, чтобы сохранить / извлечь данные так, как я хочу?

enter image description here

КАРТЫ

<class name="Party" table="Parties">
<id name="Id">
  <column name="PartyId" />
  <generator class="hilo" />
</id>

...

<set access="field.camelcase-underscore" cascade="all" inverse="true" name="Names">
  <key foreign-key="Party_PartyName_FK">
    <column name="PartyNameId" />
  </key>
  <one-to-many class="Parties.Domain.Names.PartyName, Parties.Domain" />
</set>

<many-to-one access="field.camelcase-underscore" class="Parties.Domain.Party" foreign-key="Party_FK" name="Party">
  <column name="PartyId" index="PartyIndex" not-null="true"/>
</many-to-one>
<property name="TheRequiredName" not-null="true" length="50"/>
<property name="EverythingElse" />
<property name="ContextUsed" length="50"/>
<property name="Salutation" length="20"/>
<property name="EffectivePeriod" type="Smack.Core.Data.NHibernate.UserTypes.DateRangeUserType, Smack.Core.Data">
  <column name="EffectiveStart"/>
  <column name="EffectiveEnd"/>
</property>

Код модели объекта

public class Party : Entity
{
    ....

    #region Names

    /// <summary>One or more optional names.</summary>
    public virtual IEnumerable<PartyName> Names { get { return _InternalCollection_Names; } }

    protected internal virtual ICollection<PartyName> _InternalCollection_Names
    {
        get { return _names ?? (_names = new HashSet<PartyName>()); }
        set { _names = value; }
    }
    private ICollection<PartyName> _names;

    public virtual void AddPartyName(PartyName partyName)
    {
        if (partyName == null) throw new ArgumentNullException("partyName");

        // maintain association with PartyName, which will in turn add to our collection of names
        partyName.Party = this;
    }

    public virtual void RemovePartyName(PartyName partyName)
    {
        if (partyName == null) throw new ArgumentNullException("partyName");

        // maintain association with PartyName, which will in turn remove from our collection of names
        partyName.Party = null;
    }

    #endregion
}

public class PartyName : Entity, IEquatable<PersonName>
{

    /// <summary>Bi-directional relationship with the collection of partyNames kept by Party.</summary>
    [DomainSignature]
    public virtual Party Party
    {
        get { return _party; }
        set
        {
            if (_party != null)
            {
                // disassociate existing relationship
                _party._InternalCollection_Names.Remove(this);
            }
            _party = value;

            if (value != null)
            {
                //make the association
                _party._InternalCollection_Names.Add(this);
            }
        }
    }
    private Party _party;

}

}

...