0

我想通过在更新行之前Posts保留对表的整个记录​​更改来审核我的表。实体应将所有实体列与列一起存储。PostRevisionsPostPostRevisionPostRevisionId

我想用 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?
    }
}
4

1 回答 1

0

您正在寻找的关系(我认为)是一对多的:一个帖子有很多 PostRevisions。
PostRevision 引用单个 Post。
因此,我认为 Post 端的正确映射是

HasMany(x=> x.PostRevisions);  

在 PostRevision 方面:

References(x=> x.Post).  

请参阅nHibernate 文档以更完整地了解如何映射这些关联。

编辑
如果您想为您的帖子的每个修订保留历史记录,您有 2 个选项:
1. 在您的 Post 类中添加一个布尔“IsHistoric”字段。每当修改 Post 时,您都不会更改 Post 对象本身,而是将其标记为“IsHistoric = true”并创建一个表示修改后的 Post 的新 Post 对象。这是我在项目中使用的方法。
2. 创建一个继承自 Post 的“HistoricPost”类。您不必重复映射,并且可以为此类使用单独的表(table-per-subclass 策略)。
请参阅此处了解更多详情。
认为您还可以为子类指定不同的 Id 列,使用Id(x => x.SomeOtherId);在“HistoricPost”的映射中。我还没有尝试过,所以我不是 100% 确定。

于 2011-04-24T23:13:42.697 回答