【发布时间】:2016-08-29 21:34:26
【问题描述】:
我正在学习 NHibernate,所以请耐心等待。
我有一个 Order 类和一个 Transaction 类。订单与交易有一对多的关联。我数据库中的事务表对 OrderId 外键有非空约束。
订单类:
public class Order {
public virtual Guid Id { get; set; }
public virtual DateTime CreatedOn { get; set; }
public virtual decimal Total { get; set; }
public virtual ICollection<Transaction> Transactions { get; set; }
public Order() {
Transactions = new HashSet<Transaction>();
}
}
订单映射:
<class name="Order" table="Orders">
<cache usage="read-write"/>
<id name="Id">
<generator class="guid"/>
</id>
<property name="CreatedOn" type="datetime"/>
<property name="Total" type="decimal"/>
<set name="Transactions" table="Transactions" lazy="false" inverse="true">
<key column="OrderId"/>
<one-to-many class="Transaction"/>
</set>
事务类:
public class Transaction {
public virtual Guid Id { get; set; }
public virtual DateTime ExecutedOn { get; set; }
public virtual bool Success { get; set; }
public virtual Order Order { get; set; }
}
事务映射:
<class name="Transaction" table="Transactions">
<cache usage="read-write"/>
<id name="Id" column="Id" type="Guid">
<generator class="guid"/>
</id>
<property name="ExecutedOn" type="datetime"/>
<property name="Success" type="bool"/>
<many-to-one name="Order" class="Order" column="OrderId" not-null="true"/>
我真的不想要双向关联。我的交易对象不需要直接引用他们的订单对象(我只需要访问订单的交易)。但是,我必须添加它以便 Order.Transactions 持久保存到数据库中:
存储库:
public void Update(Order entity)
{
using (ISession session = NHibernateHelper.OpenSession()) {
using (ITransaction transaction = session.BeginTransaction()) {
session.Update(entity);
foreach (var tx in entity.Transactions) {
tx.Order = entity;
session.SaveOrUpdate(tx);
}
transaction.Commit();
}
}
}
我的问题是,这将为订单集合上的每笔交易发布更新(无论它是否已更改)。
我试图解决的是必须在保存订单之前显式保存交易,而不是只需将交易添加到订单然后保存订单:
public void Can_add_transaction_to_existing_order()
{
var orderRepo = new OrderRepository();
var order = orderRepo.GetById(new Guid("aa3b5d04-c5c8-4ad9-9b3e-9ce73e488a9f"));
Transaction tx = new Transaction();
tx.ExecutedOn = DateTime.Now;
tx.Success = true;
order.Transactions.Add(tx);
orderRepo.Update(order);
}
虽然我发现了很多关于建立一对多关联的文章,但其中大部分都讨论了检索数据而不是持久化数据。
非常感谢, 本
【问题讨论】:
标签: nhibernate nhibernate-mapping