NHibernate - Как удалить дочернюю сущность в двунаправленных отношениях? - PullRequest
1 голос
/ 16 августа 2011

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

У меня есть две модели: PostModel (родительская) и CommentModel (дочерняя).Для лучшего понимания мое отображение выглядит следующим образом:

Отображение для сообщения:

public class PostMap : ClassMap<PostModel> 
{
    public PostMap()
    {
        // Table
        Table("Post");

        // Relations
        HasMany<CommentModel>(o => o.Comments).KeyColumn("PostId").Inverse().Cascade.AllDeleteOrphan();
    }
}

Отображение для комментария:

public class CommentMap : ClassMap<CommentModel> 
{
    public CommentMap()
    {
        // Table
        Table("Comment");

        // References
        References<PostModel>(o => o.Post).Column("PostId");
    }
}

Теперь, что я пытаюсьсделать, чтобы удалить комментарий объекта из сообщения, как это:

public void DeleteComment(CommentModel commentToDelete) 
{
    // Delete from list
    commentToDelete.Post.Comments.Remove(commentToDelete);

    // Update parent
    Update(commentToDelete.Post);
}

Результат?Ничего не происходит.Ничего не удаляется из списка, никаких исключений или чего-либо еще.У кого-нибудь есть решение для этого или какие-то мысли?Я действительно ценю любую помощь, которую я могу получить.

TIA!

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Если вы установите Inverse (), вам придется обновить ваш комментарий

Я предлагаю такой подход:

public void DeleteComment(CommentModel commentToDelete) 
{
    // Delete from list
    commentToDelete.Post.Comments.Remove(commentToDelete);

    // This is needed because the Comments is an Inverse collection
    commentToDelete.Post = null;

    // Update parent
    Update(commentToDelete.Post);

    // Delete the comment
    Delete(commentToDelete);
}

Если вы всегда удаляете свои ассоциации в обоих объектах, вы не должны иметьпроблемы.

Вы также можете удалить обратный

HasMany<CommentModel>(o => o.Comments).KeyColumn("PostId").Cascade.AllDeleteOrphan();
0 голосов
/ 16 августа 2011

Я наконец-то нашел причину такого рода ошибок, и для меня это была манипуляция списком комментариев в моей PostModel.

В итоге я сделал это, и он отлично работает:

public void DeleteComment(CommentModel commentToDelete) 
{
    // Delete from list
    commentToDelete.Post.Comments.Remove(commentToDelete);

    // Update parent
    Update(commentToDelete.Post);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...