<;地图>;与<;索引多对多>;韩元';我不能保存在NHibernate中

<;地图>;与<;索引多对多>;韩元';我不能保存在NHibernate中,nhibernate,nhibernate-mapping,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'>

我有以下映射:

<?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>
然后客户端代码看起来有点像这样:

var basket = new Basket();
basket.Add(session.Load<Product>(productId));
session.SaveOrUpdate(basket);
var basket=新basket();
basket.Add(session.Load(productId));
会话.保存或更新(篮子);
现在,问题是这个客户机代码确实将篮子保存到Basket表中,但没有将任何项目保存到BasketItems表中(我使用的是SQLServer2005)。但是,针对内存中数据库的此测试通过了:

[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));
}
[测试]
public void可以用产品()保存篮子()//通过!!!
{
var b=新篮子();
b、 添加(_savedProduct);
_会议.保存或更新(b);
_session.Flush();
_会议.驱逐(b);
var fromDb=_session.Load(b.Id);
Assert.AreNotSame(b,fromDb);
Assert.IsTrue(fromDb.Items.ContainsKey(_savedProduct));
}
当我反对我的实际DB时,为什么它不能保存?我错过了什么


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

嗯,我发现我的客户端代码中缺少了刷新。我使用的是Castle Monorail和,所以看起来NH设施在会话关闭时不会刷新。至少在网络场景中不是这样。我假设每次请求后会话都将关闭

var basket = new Basket();
basket.Add(session.Load<Product>(productId));
session.SaveOrUpdate(basket);
[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));
}