NHibernate集合:更新不会级联

Bra*_*ler 0 c# nhibernate

这里很奇怪.如果我创建一个新的HashCode,保存HashCode,然后将事务添加到Transactions集合,级联在Update上失败.Transaction对象没有出现在DB中,奇怪的是,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>
Run Code Online (Sandbox Code Playgroud)

这是一个失败的测试用例,如果它是相关的:

[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);
}
Run Code Online (Sandbox Code Playgroud)

任何人有任何建议或想法?

Die*_*hon 5

你不是在任何地方冲洗会议.

  • 对于大多数生成器,在刷新会话之前不会保留任何更改.正如UpTheCreek所说,Session.Update(alreadyPersistentEntity)是一个noop. (2认同)