代码之家  ›  专栏  ›  技术社区  ›  Brad Heller

NHibernate系列:更新不会层叠

  •  0
  • Brad Heller  · 技术社区  · 15 年前

    这里的咖喱行为。如果我创建一个新的HashCode,保存HashCode,然后将一个事务添加到Transactions集合中,则级联在更新时失败。事务对象没有出现在数据库中,奇怪的是,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 回复  |  直到 15 年前
        1
  •  5
  •   Diego Mijelshon    15 年前

    你没有在任何地方刷新会话。

        2
  •  0
  •   Tim Hoolihan    15 年前

    将更新方法更改为以下内容:

    public virtual void Update(TObj obj)
    {
        using (ITransaction tx = CurrentSession.BeginTransaction())
        {
            CurrentSession.SaveOrUpdate(obj);
            tx.Commit();
        }
    }