添加到NHibernate中的映射集合-事务关注
本文关键字:事务 集合 映射 NHibernate 添加 | 更新日期: 2023-09-27 18:26:08
我使用带有Fluent配置的NHibernate,并且我有一个名为Administrator
:的简单实体
public class Administrator : Entity
{
public virtual ICollection<AdministratorClientAssociation> ClientsAssociation {get; protected set; }
...
public virtual void AddClient(Client newClient)
{
var clientAssociation = new AdministratorClientAssociation()
{
AssociationDate = DateTime.Now,
Client = newClient,
ClientOwner = this
};
ClientsAssociation.Add(clientAssociation);
}
}
集合ClientsAssociation
是由外键(ClientOwner
)映射的1:n
关系,并且集合已设置Cascade.OnSaveUpdate
。问题是NHibernate
在这种情况下如何处理事务关注点?通常,我会创建一个事务,在其中添加Client
,然后添加AdministratorClientAssociation
。问题是,我应该把它包装到我调用AddClient
的任何地方的事务中(因为向实体注入会话看起来很可怕),还是在映射、级联集合的情况下自动完成?
如果NHibernate刷新关系,它将在同一事务中。
尽管很多人声称在整个请求中使用事务是很常见的,但这也是错误的。
事务开始到结束之间的所有代码都应被视为原子操作。要么全部成功,要么失败。
如果我尝试添加两个客户端,而第二个客户端失败,那么第一个客户端是否应该存储?如果是这种情况,那么添加客户端就是原子操作,事务应该围绕这段代码。如果在单个客户端失败时不应该存储任何客户端,那么事务应该围绕该批进行。
你应该问自己的第二个问题是谁将负责管理交易。这个问题没有一个答案。这完全取决于应用程序的工作方式。例如,如果使用CQRS,那么事务应该由负责执行命令的组件进行管理。
其他体系结构和需求将需要其他解决方案。