在NHibernate中添加到映射集合 - 事务关注

时间:2014-10-09 19:00:48

标签: c# nhibernate

我使用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的所有地方的事务中(导致实体注入会话看起来很糟糕)还是在映射,级联集合的情况下自动完成?

1 个答案:

答案 0 :(得分:1)

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

虽然很多人声称围绕整个请求使用交易很常见,但这也是错误的。

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

如果我尝试添加两个客户端,而第二个客户端失败,那么第一个客户端是否应该存储?如果是这种情况,那么添加客户端就是原子操作,事务应该围绕那段代码。 如果在单个客户端失败时不应存储任何客户端,则该事务应该在该批处理周围。

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

其他架构和要求将需要其他解决方案。