我有以下对象结构(简化):
MainObject
Person PersonA
Person PersonB
Person
string Name
Status Status
基本上,我MainObject
可以容纳两个Person
物体。对象将Person
(对于此业务案例)始终是不同的对象,但Status
每个对象上的对象Person
可能引用相同的对象Status
(例如,它们可能都处于 DocumentsUploaded 状态)。
由于我使用的是 Fluent NHibernate,当我尝试保存 aMainObject
当两个Person
s 具有相同时,我得到以下异常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 上的每个Person
s 上加载 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();
}
}
}
提前致谢!