Хотя вы можете выселить объект, используя Session.Evict()
, я бы посоветовал взглянуть на ваш подход для проверки. Если я вас правильно понимаю, то ваш productService.Save
метод проверяет правильность переданного объекта. Вместо проверки того, что объект действителен с каким-либо типом менеджера сервисов, вы должны переместить эту проверку в сам объект и сделать так, чтобы объект никогда не становился недействительным.
Например:
class House
{
public Room Bedroom { get; set; }
}
class HouseService
{
public ValidateHouse(House aHouse) //There is no guarantee that this method is ever called
{
if (aHouse.Bedroom == null)
{
throw new InvalidFieldException();
}
}
}
В приведенном выше примере вы не можете гарантировать, что когда-либо вызывался ValidateHouse, и поэтому вы не можете гарантировать, что у вас есть действительный дом для сохранения (или что-либо сделать с ним).
Переместить валидацию в объект:
class House
{
private Room theBedroom;
public Room Bedroom
{
get
{
return theBedroom;
}
set
{
if(value == null)
{
throw new ArgumentNullException();
}
theBedroom = value;
}
}
}
В этом примере гарантируется, что спальня никогда не будет нулевой. Если кто-то пытается присвоить NULL значение для спальни, тогда генерируется исключение, и объект никогда не изменяется. Поскольку объект не изменен, NHibernate не будет пытаться сохранить его. Кроме того, это должно принести пользу всему вашему приложению, поскольку вы будете знать, что ваши объекты всегда будут в действительном состоянии.
house.Bedroom = null;
house.Bedroom.ToString(); //With option 1 this will throw a NullPointerException.
house.Bedroom = null; //With option 2 this will throw an ArgumentNullException
//but your house object will still be in a known valid state.
house.Bedroom.ToString();