<index-many-to-many>的<map>将无法保存在NHibernate </index-many-to-many> </map>

时间:2009-06-25 01:33:24

标签: nhibernate nhibernate-mapping

我有以下映射:

<?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));
}

当我反对我的实际数据库时,为什么它不会保存的任何想法?我错过了什么?

注意:我为这个例子翻译了我的实体,我希望即使我用葡萄牙语留下了一些内容,它仍然可以理解; - )

1 个答案:

答案 0 :(得分:0)

好吧,发现我错过了我的客户端代码中的 Flush 。我正在使用Castle Monorail和NHibernate Facility,所以看起来NH Facility在会话结束时不会刷新。至少不在Web场景中。我假设每次请求后会话都被关闭。