我有以下对象结构(简体):如何在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();
}
}
}
(MainObject
,Person
和Status
所有继承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();
}
}
}
谢谢!
是状态类还是枚举? – Chris
我不认为你想要达到什么样的原则是错误的。我们有一些类似的代码工作得很好。你如何创建/访问/链接你的代码中的状态对象? – fluent
@Chris:状态是一个类(它再次包含枚举,显示文本等)。 – Halvard