代码之家  ›  专栏  ›  技术社区  ›  Christoph Jonathan

对现有对象进行多对多映射

  •  0
  • Christoph Jonathan  · 技术社区  · 16 年前

    我在尝试建立一种多对多的关系时遇到了一些问题。目标是拯救一个客户以及他们可以购买哪些产品。这些产品对客户来说不是唯一的,在我们尝试将客户与它们关联之前,它们将始终存在于数据库中。

    我的关联映射当前看起来像…

    <set name="AllowedProducts" table="Customer_AllowedProducts">
          <key column="CustomerId"></key>
          <many-to-many class="Product" column="ProductId"/>
    </set>
    

    如果我试图挽救一个客户,我会得到一个 NHibernate.TransientObjectException 引用产品。我知道我可以将Cascade添加到集合中,但在保存客户时,我从不想更新或保存产品,我们只想将客户映射到现有产品。

    我应该注意,我试图保存的客户来自一个WebService调用,因此不引用以前加载到会话中的产品。我希望避免加载将映射到会话中的每个产品。

    谢谢

    2 回复  |  直到 16 年前
        1
  •  1
  •   Diego Mijelshon    16 年前

    您的代码应该如下所示:

    customer.AllowedProducts.Add(session.Load<Product>(productIdFromTheRequest));
    

    而不是你可能正在做的事情:

    customer.AllowedProducts.Add(new Product {Id = productIdFromTheRequest});
    

    值得注意的是 Load 从未 转到数据库;它只返回一个代理(或检索到的实例,如果当前会话中有一个实例的话)

        2
  •  0
  •   lalit    16 年前

    您必须将产品附加到休眠会话,以便它们成为托管实体。据我所知,没有别的出路了。

    推荐文章