Cascade = "all" не сохраняет дочерние объекты - PullRequest
1 голос
/ 22 июля 2011

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

Но это явно не ...

Может кто-нибудь объяснить, почему PartyName не сохраняется с Party и что нужно сделать, чтобы исправить?

Приветствия
Berryl

enter image description here

КАРТЫ

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

<discriminator column="Type" not-null="true" type="string" />

<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>

<subclass 
  name="Smack.Core.TestingSupport.NHibernate.TestableDomain.SomeDopeyDomainModel.Student, Smack.Core.TestingSupport" 
  discriminator-value="Student"
  >
  <property name="Number" />

  <many-to-one 
    class="Smack.Core.TestingSupport.NHibernate.TestableDomain.SomeDopeyDomainModel.Course, Smack.Core.TestingSupport" 
    foreign-key="Course_FK" 
    name="Course">
    <column name="CourseId" index="CourseIndex" />
  </many-to-one>
</subclass>

<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>

Неудачный тест (и вывод)

    [Test]
    public void CanSaveAndLoad_AllProperties()
    {
        var partyName = NameSeeds.DevName;
        partyName.Party = _party;
        Assert.That(_party.Names.First(), Is.EqualTo(partyName));


        using (var tx = _session.BeginTransaction())
        {
            _session.Save(_party);
            tx.Commit();
        }
        _session.Clear();

        Party foundParty;
        using (var tx = _session.BeginTransaction())
        {
            foundParty = _session.Get<Party>(_party.Id); *** <=== name s/b saved!!
            tx.Commit();
        }
        PartyName foundName = foundParty.Names.First();
        //found.Look();

        Assert.That(foundName, Is.EqualTo(partyName));
        Assert.That(foundName.Party, Is.Not.Null);
        Assert.That(foundName.TheRequiredName, Is.EqualTo(partyName.TheRequiredName));
        Assert.That(foundName.EverythingElse, Is.EqualTo(partyName.EverythingElse));
        Assert.That(foundName.ContextUsed, Is.EqualTo(partyName.ContextUsed));
        Assert.That(foundName.Salutation, Is.EqualTo(partyName.Salutation));
        Assert.That(foundName.EffectivePeriod, Is.EqualTo(partyName.EffectivePeriod));
    }


NHibernate: INSERT INTO Parties (Type, PartyId) VALUES ('Parties.Domain.Party', @p0);@p0 = 32768 [Type: Int32 (0)]
NHibernate: SELECT party0_.PartyId as PartyId2_0_, party0_.Number as Number2_0_, party0_.CourseId as CourseId2_0_, party0_.Type as Type2_0_ FROM Parties party0_ WHERE party0_.PartyId=@p0;@p0 = 32768 [Type: Int32 (0)]

1 Ответ

2 голосов
/ 22 июля 2011

При отображении Имен <set> inverse=true вам придется явно вызывать session.Save (partyNameObject) для каждого члена коллекции. Если вы хотите, чтобы NHibernate автоматически сохранял членов набора при сохранении объекта PartyObject, вам нужно изменить обратный атрибут Names <set> на inverse=false. Это говорит Nhibernate, что вы хотите, чтобы Party контролировала отношения между Party и PartyName. Вы также должны не забыть добавить каждый partyNameObject в коллекцию Party.Names. В противном случае они не будут сохранены при вызове Session.Save(partyObject). Имейте в виду, что наличие родительского элемента управления может быть полезно, но если вам удастся сохранить PartyObject без загрузки коллекции PartyNames, NHibernate обновит их Party FK до Null. В этом сценарии с определенными параметрами каскада, установленными в именах <set>, вы также можете найти Nhibernate, удаляя их.

...