C# 添加到NHibernate中的映射集合-事务问题

C# 添加到NHibernate中的映射集合-事务问题,c#,nhibernate,C#,Nhibernate,我使用具有流畅配置的NHibernate,我有一个名为Administrator的简单实体: public class Administrator : Entity { public virtual ICollection<AdministratorClientAssociation> ClientsAssociation {get; protected set; } ... public virtual void AddClient(Client newC

我使用具有流畅配置的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);
    }
}
公共类管理员:实体
{
公共虚拟ICollection客户端关联{get;protected set;}
...
公共虚拟void AddClient(Client newClient)
{
var clientAssociation=新管理员客户关联()
{
AssociationDate=日期时间。现在,
Client=newClient,
客户所有者=此
};
ClientsAssociation.Add(clientAssociation);
}
}

集合
clientsasociation
是由外键(
ClientOwner
)映射的
1:n
关系,它设置了
Cascade.OnSaveUpdate
。问题是在这种情况下,
NHibernate
如何处理事务性问题?通常,我会创建一个事务,在其中添加
客户端
,然后添加
管理员客户端关联
。问题是-我应该在调用
AddClient
的任何地方将其包装到事务中(因为向实体注入会话看起来很糟糕),还是在映射级联收集的情况下自动完成

如果NHibernate刷新关系,它将在同一事务中

尽管许多人声称围绕整个请求使用事务是很常见的,但这也是错误的

事务开始和结束之间的所有代码都应视为原子操作。要么全部成功,要么失败

如果我尝试添加两个客户端,而第二个客户端失败,那么是否应该存储第一个客户端?如果是这样的话,那么添加一个客户端就是原子操作,事务应该围绕这段代码进行。 如果当一个客户端出现故障时,不应存储任何一个客户端,则事务应围绕该批处理

你应该问自己的第二个问题是谁将负责管理交易。这个问题没有一个答案。这完全取决于应用程序的工作方式。例如,如果使用CQR,则事务应由负责执行命令的组件管理


其他体系结构和需求将需要其他解决方案。

这是什么类型的应用程序?在web应用程序中,通常在事务中包装请求