Жизненный цикл объекта в NHibernate

Я думаю, что я упускаю кое-что концептуально относительно NHibernate. У меня есть объект Instrument , который отображается в таблицу tools в моей базе данных. У меня также есть объект BrokerInstrument , который отображается в мою таблицу brokerInstruments в моей базе данных. brokerInstrumnets - это дочерняя таблица для инструментов . Мои классы выглядят так:

public class Instrument : Entity
{
    public virtual string Name { get;  set; }
    public virtual string Symbol {get;  set;}
    public virtual ISet<BrokerInstrument> BrokerInstruments { get; set; }
    public virtual bool IsActive { get; set; }        
}

public class BrokerInstrument : Entity
{
    public virtual Broker Broker { get; set; }
    public virtual Instrument Instrument { get; set; }
    public virtual decimal MinIncrement { get; set; }
}

В моем модульном тесте, если я извлекаю инструмент из базы данных, а затем удаляю его с помощью ISession.Удалите , он будет удален из базы данных вместе с дочерними элементами (в моем файле сопоставления включен каскадный режим). Однако прибор все еще существует в памяти. Например:

    [Test]
    public void CascadeTest()
    {
        int instrumentId = 1;
        IInstrumentRepo instruments = DAL.RepoFactory.CreateInstrumentRepo(_session);
        Instrument i = instruments.GetById<Instrument>(instrumentId); // retrieve an instrument from the db
        foreach (BrokerInstrument bi in i.BrokerInstruments)
        {
            Debug.Print(bi.MinIncrement.ToString()); // make sure we can see the children
        }

        instruments.Delete<Instrument>(i); // physically delete the instrument row, and children from the db

        IBrokerInstrumentRepo brokerInstruments = DAL.RepoFactory.CreateBrokerInstrumentRepo(_session);
        BrokerInstrument deletedBrokerInstrument = brokerInstruments.GetById<BrokerInstrument>(1); // try and retrieve a deleted child
        Assert.That(instruments.Count<Instrument>(), Is.EqualTo(0)); // pass (a count in the db = 0)
        Assert.That(brokerInstruments.Count<BrokerInstrument>(), Is.EqualTo(0)); // pass (a count of children in the db = 0)
        Assert.That(i.BrokerInstruments.Count, Is.EqualTo(0)); // fail because we still have the i object in memory, although it is gone from the db

    }

Каковы наилучшие методы работы с объектом в памяти? Сейчас я нахожусь в несогласованном состоянии, потому что у меня есть объект Instrument в памяти, которого нет в базе данных. Я начинающий программист, поэтому очень ценю подробные ответы со ссылками.

7
задан reporter 16 January 2012 в 13:12
поделиться