Таблица изменений карт в Fluent NHibernate - PullRequest
0 голосов
/ 25 апреля 2011

Я хочу провести аудит моей таблицы Posts, сохранив изменения всей записи в таблице PostRevisions до обновления строк Post. Объекты PostRevision должны хранить все столбцы Post объектов вместе со столбцом RevisionId.

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

Как мне спроектировать свои сущности и сопоставления для достижения этого?

Требуемый псевдокод для редактирования сообщения

var post = _unitOfWork.CurrentSession.Get<Post>(id);
var postRevision = new PostRevision(post);

post.Content = "changed value"; // change some things here

_unitOfWork.CurrentSession.Save(post);
_unitOfWork.CurrentSession.Save(postRevision);

_unitOfWork.Commit();

PostRevision класс композиции:

public class PostRevision
{
    public virtual Guid Id { get; private set; }
    public virtual Post Post { get; set; }

    public PostRevision()
    {
    }

    public PostRevision(Post post)
    {
        this.Post = post;
    }
}

Возможное отображение карт:

public class PostRevisionMap : ClassMap<PostRevision>
{
    public PostRevisionMap()
    {
        Id(x => x.Id);
        Component(x => x.Post); // will something like this work?
    }
}

1 Ответ

0 голосов
/ 25 апреля 2011

отношение (я думаю), которое вы ищете, одно-ко-многим: пост имеет много PostRevisions.
PostRevision ссылается на один пост.
Поэтому я думаю, что правильное отображение на стороне сообщения будет

HasMany(x=> x.PostRevisions);  

и на стороне PostRevision:

References(x=> x.Post).  

см. nHibernate docs для более полного взгляда на то, как отобразить эти ассоциации.

Редактировать
Если вы хотите вести историю для каждой ревизии вашего поста, у вас есть 2 варианта: 1. добавьте логическое поле IsHistoric в свой класс Post. Всякий раз, когда публикация пересматривается, вы не изменяете сам объект публикации, а просто помечаете его как «IsHistoric = true» и создаете новый объект публикации, который представляет измененную публикацию. Это метод, который я использую в своем проекте.
2. Создайте класс HistoricPost, который наследуется от Post. Вам не нужно повторять сопоставление, и вы можете использовать отдельную таблицу для этого класса (стратегия «таблица на подкласс»).
см. здесь для получения более подробной информации.
Я думаю вы также можете указать другой столбец Id для дочернего класса, используя Id(x => x.SomeOtherId); в отображении 'HistoricPost'. Хотя я не пробовал, поэтому я не уверен на 100%.

...