我正在尝试创建一个多对多关系的问题。目标是保存客户以及允许他们购买哪些产品。这些产品并非客户所独有,在我们尝试将客户与客户关联之前,它们始终存在于数据库中。
我的关联映射目前看起来像......
<set name="AllowedProducts" table="Customer_AllowedProducts">
<key column="CustomerId"></key>
<many-to-many class="Product" column="ProductId"/>
</set>
如果我尝试保存客户,我会NHibernate.TransientObjectException
引用该产品。我知道我可以添加级联到套装,但我从不想在保存客户时更新或保存产品,我们只想将客户映射到现有产品。
我应该注意,我正在尝试保存的客户来自webservice调用,因此不会引用先前已加载到会话中的产品。我想避免必须加载将映射到会话中的每个产品。
由于
答案 0 :(得分:1)
您的代码应如下所示:
customer.AllowedProducts.Add(session.Load<Product>(productIdFromTheRequest));
而不是你可能在做什么:
customer.AllowedProducts.Add(new Product {Id = productIdFromTheRequest});
值得注意的是Load
从不进入数据库;它只返回一个代理(或检索到的实例,如果当前会话中存在一个)
答案 1 :(得分:0)
您必须将产品附加到休眠会话,以便它们成为管理实体。据我所知,没有其他出路。