Я замечаю странное поведение в моем приложении, которое использует NHibernate
Чтобы дать вам немного фона, в базе данных есть 2 таблицы:
1) Транзакция
2) Автомобиль
Транзакция связана с транспортным средством один на один.
У меня есть вспомогательный класс базы данных, в котором есть методы Save и GetAll.
Поэтому, когда я запускаю следующий код, все работает, как задумано.
Transaction t;
using (var session = sessionFactory.OpenSession())
{
t = dbHelper.GetAll<Transaction>(session)[0];
t.Vehicle.Odometer = "777";
dbHelper.Save(t, session); // This updates the vehicle table's odometer property to 777
}
Однако, если я изменю свой код следующим образом
Transaction t;
using (var session = sessionFactory.OpenSession())
{
t = dbHelper.GetAll<Transaction>(session)[0];
}
using (var session = sessionFactory.OpenSession())
{
t.Vehicle.Odometer = "777";
dbHelper.Save(t, session); // This does not update the vehicle table.
// but
dbHelper.Save(t.Vehicle, session); // Works
}
Значит ли это, что свойства отношений зависят от сеанса?
редактирование:
Я использую Fluent с AutoMapper, и это одно из классифицированных правил, которые я использую:
internal class OneToOneConvention : IHasOneConvention
{
public void Apply(IOneToOneInstance instance)
{
instance.Cascade.All();
}
}
редактировать
Вот 2 метода внутри dbHelper
public void Save<T>(T entity, ISession session)
{
using (ITransaction transaction = session.BeginTransaction())
{
try
{
session.SaveOrUpdate(entity);
transaction.Commit();
}
catch (Exception)
{
transaction.Rollback();
throw;
}
}
}
и GetAll
public IList<T> GetAll<T>(ISession session) where T : class
{
return session.CreateCriteria<T>().List<T>();
}