我有一个与另一个对象保持关系的对象:
public class Foo {
public Bar Bar { get; set; }
}
在映射引用栏中,我可以维护关系-我不希望父对象更新子对象中的属性,只希望关系的存在:
References(x => x.Bar, "BarId")
.Cascade.None();
在UI层中,我使用不是基础主键的属性创建关系:
item.Bar = new Bar { Code = "123" };
在存储库层中,如果对象没有填充主键,我将删除该对象:
if(item.Bar.Id == null)
{
item.Bar = barRepository.RetrieveByCode(item.Bar.Code);
}
当我运行相同的代码路径而不创建临时条对象时,它就工作了。似乎NHibernate跟踪了作为临时项目创建的条,但是我希望它忘记它曾经存在过,因为它只是一个占位符。
你对如何做到这一点有什么想法吗?
更新
:对此进行更多的测试似乎是Foo中的更改跟踪造成了问题。如果我在检索Session.execit(item)之后调用它,但在进行任何更改之前调用它,然后在完成操作之后使用Session.Update(item)重新附加该对象,它似乎可以工作,但是它会更新子对象,这不是我想要的-我只想管理关系。
更新2
:更改FlushMode可能会导致需要多个操作步骤的事务出现其他问题。我回头尝试另一种方法:
if(item.Bar.Id == null)
{
var barCode = item.Bar.Code;
item.Bar = null;
item.Bar = barRepository.RetrieveByCode(barCode);
}