nhibernate много-к-одному - PullRequest
       14

nhibernate много-к-одному

0 голосов
/ 20 мая 2011

У меня возникла эта проблема ..

using (var transaction = Session.BeginTransaction())
            {
                var t = new Ticket();
                t.Title = "TestTicket";
                var ticketId = (Guid)Session.Save(t);

                var pe = new ProcessExec();
                pe.Ticket = t;
                Session.Save(pe);

                var ticket = Session.Get<Ticket>(ticketId);
                transaction.Commit();

                Assert.NotNull(ticket);
                Assert.True(ticket.ProcessExecCollection.Count > 0);
            }

Теперь проблема в том, что assert не удается на

Assert.True (ticket.ProcessExec.Count> 0).

Но если я сделаю

Session.Refresh (тикет);

просто после транзакции. Commit () все работает отлично.Как сообщить NHibernate, что когда я создаю новый ProcessExec и устанавливаю его билет, чтобы автоматически обновлять билет?

Мне это нужно, потому что я делаю много вещей, создающих и выбирающих в транзакции.

Пожалуйстасправка.

<class name="Domain.Model.Sdwwf.ProcessExec" table="[PROCESS_EXEC]" schema="[SDWWF]" dynamic-update="true">
<id name="Id" column="ID" type="Guid">
  <generator class="guid" />
</id>
<version name="Version" column="VERSION" />
<many-to-one name="Ticket" column="[TICKET_ID]" cascade="save-update, persist" />  

<class name="Domain.Model.Sdwwf.Ticket" table="[TICKET]" schema="[SDWWF]" dynamic-update="true">
    <id name="Id" column="ID" type="Guid">
      <generator class="guid" />
    </id>
    <version name="Version" column="VERSION" />
    <bag name="ProcessExec" inverse="true" cascade="all">
      <key column="[TICKET_ID]" />
      <one-to-many class="Softworks.SDW.Domain.Model.Sdwwf.ProcessExec" />
    </bag>
    <property name="Title" column="[TITLE]" />
</class>

1 Ответ

1 голос
/ 20 мая 2011

Происходит следующее: когда вы выполняете вызов ISession.Get перед фиксацией транзакции, сеанс еще не сбрасывается, поэтому он получает кэшированную версию сущности. NHibernate не похож на использование соединения с базой данных, поскольку в большинстве случаев он очень ленив. Он попадет в базу данных только тогда, когда это абсолютно необходимо.

Вы можете либо обновить сущность вручную, как вы сказали, либо вы можете вручную

ticket.ProcessExecCollection.Add(new ProcessExec());

Затем, когда вы сохраните тикет, NHibernate будет каскадировать вновь созданный ProcessExec. Тем самым вы экономите вам второй звонок на NHibernate.

...