3

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

MainObject
  Person PersonA
  Person PersonB
Person
  string Name
  Status Status

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

由于我使用的是 Fluent NHibernate,当我尝试保存 aMainObject当两个Persons 具有相同时,我得到以下异常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();
        }
    }
}

( MainObject,Person并且Status所有继承DomainEntity和一切工作正常,除了上面描述的场景)

编辑:加载代码

Status这是在 s 上的每个Persons 上加载 s 的简化代码MainObject

_mainObject.PersonA.Status = _repository.GetStatus(StatusCode.NotSet);
_mainObject.PersonB.Statys = _repository.GetStatus(StatusCode.NotSet);

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

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

这是查询的代码:

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();
        }
    }
}

提前致谢!

4

1 回答 1

2

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

如果项目是 Web 服务,我建议您将会话创建/处置与 http 请求联系起来。

于 2012-10-26T11:33:32.737 回答