У меня есть следующее отображение:
<?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);
Теперь проблема в том, что этот код клиента сохраняет корзину в таблицу корзин, но не сохраняет элементы в таблицу 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));
}
Любые идеи о том, почему это не спасет, когда я против моей фактической БД? Чего мне не хватает?
Примечание: я перевел свои сущности для этого примера, надеюсь, он все еще понятен, даже если я что-то оставил на португальском языке;