<map> с <index-many-to-many> не сохранится в NHibernate - PullRequest
0 голосов
/ 25 июня 2009

У меня есть следующее отображение:

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

Любые идеи о том, почему это не спасет, когда я против моей фактической БД? Чего мне не хватает?

Примечание: я перевел свои сущности для этого примера, надеюсь, он все еще понятен, даже если я что-то оставил на португальском языке;

1 Ответ

0 голосов
/ 26 июня 2009

Что ж, я обнаружил, что мне не хватает Flush в моем клиентском коде. Я использую Castle Monorail и NHibernate Facility , поэтому кажется, что NH Facility не сбрасывается при закрытии сессии. По крайней мере, не в веб-сценарии. Я предполагаю, что сессия закрывается после каждого запроса.

...