代码之家  ›  专栏  ›  技术社区  ›  Colin Bowern

使用临时对象会导致临时对象异常

  •  1
  • Colin Bowern  · 技术社区  · 14 年前

    我有一个与另一个对象保持关系的对象:

    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); 
    }
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   Jamie Ide    14 年前

    你为什么要这样做?为什么不简单地使用检索到的Bar对象设置item.Bar:

    item.Bar = barRepository.RetrieveByCode("123");
    

    您可以使用 Load :

    if(item.Bar.Id == null)
    {
        var bar = barRepository.RetrieveByCode(item.Bar.Code);
        item.Bar = session.Load<Bar>(bar.Id);
    }