Коллекции NHibernate: обновление не происходит каскадно - PullRequest
0 голосов
/ 03 ноября 2010

Пьяное поведение здесь. Если я создаю новый HashCode, сохраняю HashCode, а затем добавляю транзакцию в коллекцию транзакций, каскад не работает при обновлении. Объект Transaction не отображается в БД, и, что любопытно, свойства объекта HashCode также не обновляются!

Я понятия не имею, что может быть причиной этого. Вот соответствующее отображение:

<class name="MyProject.HashCode, MyProject" table="HashCodes">
    <id column="Id" name="Id">
      <generator class="native" />
    </id>

    <many-to-one name="User" column="UserId" class="MyProject.User, MyProject" />
    <property name="Hash" />
    <property name="PasswordHash" />
    <property name="InitialValue" update="false" />
    <property name="CurrentValue" update="true" />
    <property name="ClaimedDate" />
    <property name="ClaimId" column="RowGuid" generated="insert" />

    <bag name="Transactions" table="Transactions" cascade="all" inverse="true">
      <key column="HashCodeId" />
      <many-to-many column="Id" class="MyProject.Transaction, MyProject" />
    </bag>
</class>

<class name="MyProject.Transaction, MyProject" table="Transactions">
    <id column="Id" name="Id">
      <generator class="native" />
    </id>

    <many-to-one name="HashCode" column="HashCodeId" class="MyProject.HashCode, MyProject" />
    <property name="AmountCharged" />
    <property name="AmountBilled" />
    <property name="PreviousBalance" />
    <property name="Memo" />
    <property name="TransactionDate" generated="insert" update="false" />
</class>

Вот тестовый пример, который также не работает, если он уместен:

[Test]
public void TransactionsCascadeWhenUpdatingHashCodes()
{
    var user = TestFactory.CreateUser();
    var hashCode = TestFactory.CreateHashCode(user);

    var transaction = new Transaction
    {
        AmountBilled = hashCode.CurrentValue,
        AmountCharged = decimal.Subtract(hashCode.CurrentValue, decimal.Multiply(hashCode.CurrentValue, 0.03M)),
        HashCode = hashCode,
        Memo = "This is a test",
        PreviousBalance = hashCode.CurrentValue,
        TransactionDate = DateTime.Now
    };

    hashCode.Transactions.Add(transaction);

    // Now try to save it.
    var hashCodeRepository = new HashCodeRepository(Session);
    hashCodeRepository.Update(hashCode);

    // Now see if that transaction is good to go
    Assert.IsTrue(hashCode.Transactions[0].Id > 0);

    // See if that transaction got persisted.
    var loadedTransaction = Session.Load<Transaction>(hashCode.Transactions[0].Id);
    Assert.IsNotNull(loadedTransaction);
}

// The repository method that is called...
public virtual void Update(TObj obj)
{
    CurrentSession.Update(obj);
}

У кого-нибудь есть предложения или идеи?

Ответы [ 2 ]

5 голосов
/ 03 ноября 2010

Вы нигде не очищаете сессию.

0 голосов
/ 04 ноября 2010

Измените ваш метод обновления на следующий:

public virtual void Update(TObj obj)
{
    using (ITransaction tx = CurrentSession.BeginTransaction())
    {
        CurrentSession.SaveOrUpdate(obj);
        tx.Commit();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...