Inheritance Fluent NHibernate中的映射修订表
我想通过在更新Post行之前保留对PostRevisions表的全部记录更改来审核Post表。修订后实体应存储所有修订后实体列以及修订ID列 我想用Fluent NHibernate绘制这张地图。修订后实体应该镜像修订后实体的属性,但不必维护两个实体类和映射类 我应该如何设计实体和映射来实现这一点 用于后期编辑的所需伪代码 可能的流畅映射:Inheritance Fluent NHibernate中的映射修订表,inheritance,fluent-nhibernate,triggers,nhibernate-mapping,revisions,Inheritance,Fluent Nhibernate,Triggers,Nhibernate Mapping,Revisions,我想通过在更新Post行之前保留对PostRevisions表的全部记录更改来审核Post表。修订后实体应存储所有修订后实体列以及修订ID列 我想用Fluent NHibernate绘制这张地图。修订后实体应该镜像修订后实体的属性,但不必维护两个实体类和映射类 我应该如何设计实体和映射来实现这一点 用于后期编辑的所需伪代码 可能的流畅映射: 我认为你要寻找的是一对多的关系:一篇文章有很多修改。 PostRevision引用单个帖子。 因此,我认为立柱侧的正确映射应该是 HasMany(x=>
我认为你要寻找的是一对多的关系:一篇文章有很多修改。 PostRevision引用单个帖子。 因此,我认为立柱侧的正确映射应该是
HasMany(x=> x.PostRevisions);
在修订后方面:
References(x=> x.Post).
有关如何映射这些关联的更完整信息,请参阅
编辑
如果您想为帖子的每个版本保留历史记录,您有2个选项:
1.将布尔“IsHistoric”字段添加到Post类。无论何时修改帖子,您都不会更改帖子对象本身,而是将其标记为“IsHistoric=true”,并创建一个表示修改帖子的新帖子对象。这是我在项目中使用的方法。
2.创建从Post继承的“HistoricPost”类。您不必重复您的映射,并且您可以为每个子类策略的这个类表使用一个单独的表。
有关更多详细信息,请参阅。
我认为还可以使用Idx=>x.SomeOtherId为子类指定不同的Id列;在“HistoricPost”的映射中。但是我还没有尝试过,所以我不是100%确定。@sjonny,如果我不想复制所有映射属性,PostRevisions的类映射应该是什么样子?映射将有两行-一行映射id,类似Idx=>x.id,另一行映射我发布的id。就这样。因为Post实体已经单独映射,所以您不需要再次映射它。@Sjonny,我会更清楚地回答我的问题。PostRevision中的Post应该是值对象,而不是实体引用。更新Post记录之前,其当前值将保留在PostRevisions表中。抱歉,我没有意识到这一点。在这种情况下,我看到了两个选项——要么创建一个从Post继承的新实体PostHistory,然后在PostRevision类中引用它——参见此问题。另一个选项是向Post类添加一个布尔字段-IsHistoric或类似的。在每个修订版上,您都会创建一个新的Post实例,并更新现有实例的IsHistoric字段。@Sjonny,对于选项1,PostHistory如何在不重复代码的情况下继承Post的映射?
public class PostRevisionMap : ClassMap<PostRevision>
{
public PostRevisionMap()
{
Id(x => x.Id);
Component(x => x.Post); // will something like this work?
}
}
HasMany(x=> x.PostRevisions);
References(x=> x.Post).