我使用NHibernate和Fluent配置,我有一个名为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
是由外键(1:n
)映射的ClientOwner
关系,并且已设置Cascade.OnSaveUpdate
。问题是NHibernate
如何在这种情况下处理交易概念?通常我会创建一个交易,我在其中添加Client
,然后AdministratorClientAssociation
。问题是 - 我应该将它包装到我调用AddClient
的所有地方的事务中(导致实体注入会话看起来很糟糕)还是在映射,级联集合的情况下自动完成?
答案 0 :(得分:1)
如果NHibernate刷新关系,它将在同一个事务中。
虽然很多人声称围绕整个请求使用交易很常见,但这也是错误的。
事务开始和结束之间的所有代码都应被视为原子操作。要么全部成功要么失败。
如果我尝试添加两个客户端,而第二个客户端失败,那么第一个客户端是否应该存储?如果是这种情况,那么添加客户端就是原子操作,事务应该围绕那段代码。 如果在单个客户端失败时不应存储任何客户端,则该事务应该在该批处理周围。
您应该问自己的第二个问题是谁将负责管理交易。这个问题没有一个答案。这完全取决于您的应用程序的工作方式。例如,如果您使用CQRS,那么事务应该由负责执行命令的组件管理。
其他架构和要求将需要其他解决方案。