2013-08-21 2 views
3

Я пытаюсь выяснить, как идентифицировать, что родительский объект является грязным, когда один из объектов в дочерней коллекции был изменен с помощью функций контекста NHibernate.NHibernate: Найти грязный объект в дочерней коллекции

Я имею в виду следующий случай:

public class Parent 
{ 
    public IList<Child> Childs { get; set; } 
} 

public class Child 
{ 
    public String Name {get; set; } 
} 

... 

var parent = session.Get<Parent>(1); 
parent.Childs[0].Name = "new name"; 
// here <code>session.IsEntityDirty(parent)</code> should return true 

Я знаю о расширениях ISession как здесь http://nhibernate.info/doc/howto/various/finding-dirty-properties-in-nhibernate.html и здесь для коллекции NHibernate: Find dirty collections. Но ни первый (он не отслеживает только свойства), ни второй (он отслеживает только операции add/delete на объекте коллекции).

Я хочу также упомянуть, что я предпочитаю использовать простые POCO вместо STE.

Я был бы очень признателен за решение.

ответ

0

Это не выглядит, если NHibernate проверяет, загрязнен ли объектный графа, но на самом объекте. Поэтому он игнорирует коллекции и другие ссылки.

Если вы будете следовать код

EntityEntry oldEntry = persistenceContext.GetEntry(entity); 
Object[] oldState = oldEntry.LoadedState; 

oldState включает только оригинальные ценности объекта, но включает в себя текущие значения коллекции. Поэтому я предполагаю, что NHibernate не учитывает это, но делает другой цикл где-то, чтобы перебрать эти объекты в списке и проверить их отдельно.

Способ, которым я бы это сделал, путем циклического перехода по свойствам объекта и проверки того, что с session.IsDirtyProperty пропускает коллекции и другие свойства типа объекта, но затем перебирает коллекции и для каждого объекта в коллекции, свойства объекта.

Помните, что ваш сеанс должен оставаться открытым и не очищаться, чтобы это работало, прежде чем проверять, если объект отделится от сеанса, не будет способа использовать NHibernate, чтобы проверить, загрязнен ли он.

Также не рекомендуется держать сеанс открытым в течение длительного времени, вы должны использовать его и утилизировать, когда вы это сделаете.

+0

Да, я знаю, что старые хранилища имеют одинаковые значения для коллекций, поэтому это расширение не работает. Конечно, можно перебрать все свойства, но я нашел это решение немного громоздким. Кроме того, я должен учитывать, что дочерние объекты имеют ссылку на родительский объект (как свойство). – dmitrygrig

Смежные вопросы