Creo que me falta algo conceptual con respecto a NHibernate. Tengo un objeto Instrument
que se asigna a una tabla instruments
en mi base de datos. También tengo un objeto BrokerInstrument
que se asigna a mi tabla brokerInstruments
en mi base de datos. brokerInstrumnets
es una tabla secundaria de instruments
. Mis clases se parecen:Ciclo de vida del objeto en NHibernate
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; }
}
En mi prueba de unidad, si puedo recuperar un Instrument
de la base de datos y luego eliminarlo con ISession.Delete
, se elimina de la base de datos junto con los niños (tengo cascada, todo encendido en mi archivo de mapeo). Sin embargo, el Instrument
aún existe en la memoria. Por ejemplo:
[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
}
¿Cuál es la mejor práctica con respecto al objeto en la memoria? Ahora estoy en un estado incoherente porque tengo un objeto Instrument
en memoria que no existe en la base de datos. Soy un programador novato, por lo que las respuestas detalladas con enlaces son muy apreciadas.