我有以下对象结构(简化):
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();
}
}
}
(MainObject
,Person
和Status
都继承DomainEntity
,一切正常,除了上述情况外)
修改:加载代码
这是在Status
上Person
的每个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}}
提前致谢!
答案 0 :(得分:2)
我认为问题在于会话的微观管理。如果您有一个涵盖所有数据库事务的会话,我认为您不会遇到问题。
如果项目是Web服务,我建议你看一下将会话创建/处理绑定到http请求。