如何在NHibernate会话中保存两个相等的对象?

时间:2012-10-25 14:01:39

标签: c# nhibernate fluent-nhibernate cascade

我有以下对象结构(简化):

MainObject
  Person PersonA
  Person PersonB
Person
  string Name
  Status Status

基本上,我的MainObject可以容纳两个Person个对象。 Person对象(对于此业务案例)将始终是不同的对象,但每个Status上的Person对象可能引用相同的Status(它们可能都在例如,状态DocumentsUploaded)。

由于我正在使用Fluent NHibernate,当我尝试保存MainObject时,当Person具有相同的Status时,我会收到以下异常: 具有相同标识符值的其他对象已与会话相关联。这是有道理的,因为两个Status对象都是相同的。

当我用谷歌搜索错误时,我发现大多数帖子都发现有人错误地在他们的会话中得到了相同的标识符(我想要故意)。

我还考虑将Status上的Person字段更改为整数,但这感觉不对(如果您愿意,则取消面向对象)。

问题:有没有办法解决这个问题,任何告诉NHibernate的方法,是的,我知道他们有相同的标识符,但我还想保存它?如果没有,这是不可能的原因,你的建议是什么?

如果重要;

以下是我的存储库中的代码:

public void Save<T>(T entity) where T : DomainEntity
{
    using (var session = _sessionSource.CreateSession())
    {
        using (var transaction = session.BeginTransaction())
        {
            session.SaveOrUpdate(entity);
            transaction.Commit();
        }
    }
}

MainObjectPersonStatus都继承DomainEntity,一切正常,除了上述情况外)

修改:加载代码

这是在StatusPerson的每个MainObject上加载_mainObject.PersonA.Status = _repository.GetStatus(StatusCode.NotSet); _mainObject.PersonB.Statys = _repository.GetStatus(StatusCode.NotSet); 的简化代码:

public Status GetStatus(StatusCode statusCode)
{
    return Repository.Query<Status>(x => x.StatusCode == statusCode).FirstOrDefault();
}

这是存储库中GetStatus的简化代码:

public List<T> Query<T>(Expression<Func<T, bool>> expression) where T : DomainEntity
{
    using (var session = _sessionSource.CreateSession())
    {
        using (var transaction = session.BeginTransaction())
        {
            var result = session.Query<T>().Where(expression);
            transaction.Commit();
            return result.ToList();
        }
    }
}

这是Query的代码:

{{1}}

提前致谢!

1 个答案:

答案 0 :(得分:2)

我认为问题在于会话的微观管理。如果您有一个涵盖所有数据库事务的会话,我认为您不会遇到问题。

如果项目是Web服务,我建议你看一下将会话创建/处理绑定到http请求。