Родитель - Дочерние отношения в NHibernate - PullRequest
1 голос
/ 09 июля 2010

Я хочу иметь возможность создать родительский объект с дочерними элементами и позволить родительскому объекту обрабатывать обновление, сохранять и удалять.

Мои классы карты.

ParentMap

    Id(x => x.Id, "ID").GeneratedBy.Identity();
        Map(x => x.Name);                

        HasMany(x => x.Children)
            .KeyColumn("ParentID")
            .Inverse()
            .Cascade
            .AllDeleteOrphan()
            .AsBag();

ChildMap

Id(x => x.Id, "ID").GeneratedBy.Identity();
Map(x => x.Name);            
Map(x => x.Value);            
References(x => x.Parent);

Это код.

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

var parent = new Parent();
parent.Id = _view.parentID;
parent.Name = _view.Name;
parent.Children = _view.Children; 

Я также попробовал приведенный ниже код, но это возвращает неуникальную ошибку.

var parent = repository.Get(_view.parentID);
parent.Name = _view.Name;
parent.Chidlren = _view.Children;

Может кто-нибудь сказать мне лучший способ справиться с этим в NHibernate?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 09 июля 2010

Нельзя переназначить дочернюю коллекцию с помощью NHibernate. NHibernate в основном «следит» за дочерней коллекцией за изменениями, чтобы знать, как обрабатывать сохранения в базе данных. Если вы переназначаете дочернюю коллекцию, NHibernate теряет ссылку и больше не может отслеживать изменения. Чтобы обойти это, вы должны изменить дочернюю коллекцию, но не переназначать ее.

Как я обычно это делаю, я делаю коллекцию только для чтения с помощью частного сеттера. Затем я добавляю методы в родительский класс для изменения списка по мере необходимости.

private IList<ChildRecord> theChildCollection = new List<ChildRecord>();
/// <summary>
/// The collection of child records.
/// </summary>
public virtual IList<ChildRecord> Children
{
   get
   {
      return theChildCollection.ToList().AsReadOnly();
   }
   private set
   {
      theChildCollection = value;
   }
}

/// <summary>
/// Adds a record to the child collection.
/// </summary>
public void Add(ChildRecord aRecord)
{
   theChildCollection.Add(aRecord);
}

/// <summary>
/// Removes a record from the child collection.
/// </summary>
public void Delete(ChildRecord aRecord)
{
   theChildCollection.Remove(aRecord);
}
0 голосов
/ 09 июля 2010

Попробуйте сначала очистить коллекцию Children:

var parent = new Parent();
parent.Id = _view.parentID;
parent.Name = _view.Name;
parent.Children.Clear();
parent.Children = _view.Children;

Я не уверен, что переназначение коллекции является хорошей практикой.Я рекомендую очистить коллекцию, затем пройтись по _view.Children и добавить каждого потомка.Еще лучше, используйте метод расширения IEnumerable Except, чтобы определить, какие дочерние элементы должны быть добавлены или удалены, и обработайте их индивидуально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...