<;地图>;与<;索引多对多>;韩元';我不能保存在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));
}