Nhibernate映射和版本化实体
我正在做一个使用NHibernate作为ORM的项目 正在使用的持久性模型为实体创建新行,并为每个后续保存创建一个新的entity.Id。实体的所有修订都由OriginatingId列链接,其中具有给定OriginatingId的maxentity.Id的实体是当前修订 我有两个实体a和B B需要包含对a的引用。这可以通过使用B.a_Id=a.Id上的连接进行映射来实现 问题是当保存A时,A的最新版本有一个新Id,因此如果B保持不变,它将引用实体A的旧版本Nhibernate映射和版本化实体,hibernate,nhibernate,Hibernate,Nhibernate,我正在做一个使用NHibernate作为ORM的项目 正在使用的持久性模型为实体创建新行,并为每个后续保存创建一个新的entity.Id。实体的所有修订都由OriginatingId列链接,其中具有给定OriginatingId的maxentity.Id的实体是当前修订 我有两个实体a和B B需要包含对a的引用。这可以通过使用B.a_Id=a.Id上的连接进行映射来实现 问题是当保存A时,A的最新版本有一个新Id,因此如果B保持不变,它将引用实体A的旧版本 使用NHibernate的映射属性如何
使用NHibernate的映射属性如何确保在保存实体A时更新实体B的A_Id属性?使用此版本控制时,每个实体和版本部分始终有一个主条目。您必须比您想象的更快地处理历史数据,因此您需要访问它。现在引用没有问题,因为主Id没有更改。变更零件的Id也可以是变更日期
class B
{
public virtual int Id { get; protected set; }
public virtual string NaturalKey { get; protected set; } // never changes
public virtual Ilist<BData> Data { get; protected set; }
private BData _changedData;
public virtual BData ActualData { get { return _changedData == null ? _changedData = Data.Last().Clone() : _changedData; } }
}
class BData
{
public BData Clone() { ... }
}
mapping.List(x => x.Data, p => p.OrderBy("changedDate"))
简而言之,您决定使用的版本控制设计是,如果它们的附加键ID发生更改,则引入新对象==不相同-这些对象是不同的。ORM原样-不是为这种场景设计的。它保留对原始对象的引用/关系ID。这是ORM最有力的部分:这个承诺是有效的。根据我的经验,这种版本控制不适合ORM。你没有做NHibernate设计支持的事情。很抱歉没有更好的评论…谢谢-我很感激使用的版本控制机制不适合NHibernate,但是现在我无法改变这一点。如果没有办法处理这种情况,我可能必须在DAL中明确地管理这种情况。有点乱!嗯,我不知道你会怎么做。您将如何发现加载到会话中的任何对象(它不是脏的)都有一个坏的旧引用id?那么所有未加载到会话中的对象呢。我只是想说:你会失败,或者付出太多的精力。。。那个抱歉没有说好话。。。但我确实受够了,至少我试着劝阻你们不要因为版本控制而改变参考模型。不管怎么说,祝你好运。。。