我有以下映射:
<?xml version='1.0' encoding='utf-8'?>
<hibernate-mapping
assembly='Core'
namespace='Core.Models'
xmlns='urn:nhibernate-mapping-2.2'>
<class name='Basket'>
<id name='Id'
column='id'>
<generator class='native'/>
</id>
<property name="ExternalId" />
<map name="Items" table="BasketItems" cascade="save-update">
<key column="BasketId" />
<index-many-to-many class="Product" column="ProductId" />
<element column="Quantity" type="System.Int32" />
</map>
</class>
</hibernate-mapping>
这是Items集合的样子:
public virtual IDictionary<Product, int> Items { get; private set; }
我有一个像这样的Add方法:
public virtual void Add(Product product, int quantity)
{
if (Items.ContainsKey(product))
Items[product] += quantity;
else
Items.Add(product, quantity);
}
然后客户端代码看起来像这样:
var basket = new Basket();
basket.Add(session.Load<Product>(productId));
session.SaveOrUpdate(basket);
现在,问题是这个客户端代码确实将Basket保存到购物篮表,但是没有将任何商品保存到BasketItems表(我使用的是SQL Server 2005)。但是,针对内存数据库的此测试通过了:
[Test]
public void Can_save_basket_with_products() // Passes!!!
{
var b = new Basket();
b.Add(_savedProduct);
_session.SaveOrUpdate(b);
_session.Flush();
_session.Evict(b);
var fromDb = _session.Load<Basket>(b.Id);
Assert.AreNotSame(b, fromDb);
Assert.IsTrue(fromDb.Items.ContainsKey(_savedProduct));
}
当我反对我的实际数据库时,为什么它不会保存的任何想法?我错过了什么?
注意:我为这个例子翻译了我的实体,我希望即使我用葡萄牙语留下了一些内容,它仍然可以理解; - )
答案 0 :(得分:0)
好吧,发现我错过了我的客户端代码中的 Flush 。我正在使用Castle Monorail和NHibernate Facility,所以看起来NH Facility在会话结束时不会刷新。至少不在Web场景中。我假设每次请求后会话都被关闭。