2012-10-25 67 views
3

我有以下对象结构(简体):如何在NHibernate会话中保存两个相同的对象?

MainObject 
    Person PersonA 
    Person PersonB 
Person 
    string Name 
    Status Status 

基本上,我MainObject可以容纳两个Person对象。 Person对象将(对于此业务案例)始终是不同的对象,但每个Person上的Status对象可能指代相同的Status(例如,它们都可能处于状态“文档上传”状态)。

由于我使用功能NHibernate我出现以下情况例外,当我尝试保存MainObject当两个Person■找相同Status不同的对象具有相同标识符值已与会话关联。这是合理的,因为Status对象都是相同的。

当我GOOGLE了错误,我主要发现的帖子,事实证明,有人在他们的会话中有错误的相同标识符(我想目的)。

我也考虑将上的Status字段更改为一个整数,但感觉不对(如果您愿意的话,不会面向对象)。

问题:有什么办法可以告诉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,一切工作正常,除了上面描述的场景)

编辑:代码加载

这是在的每个上加载Status的简化代码个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(); 
     } 
    } 
} 

谢谢!

+0

是状态类还是枚举? – Chris

+0

我不认为你想要达到什么样的原则是错误的。我们有一些类似的代码工作得很好。你如何创建/访问/链接你的代码中的状态对象? – fluent

+0

@Chris:状态是一个类(它再次包含枚举,显示文本等)。 – Halvard

回答

2

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

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

+0

附加注释:加载和混合如此多的会话导致了问题。在一个工作单元(事务)中用一个会话完成所有这些工作将移除异常。我也会听取你关于将会话生命周期与http请求绑定的建议。 – Halvard

相关问题