NHibernate:有状态会话和无状态会话需要不同的映射

本文关键字:会话 状态 映射 NHibernate | 更新日期: 2023-09-27 18:29:16

我正在使用Fluent NHibernate读取和写入文件。目前,我有父子关系,映射由定义

public class ParentMappings: ClassMap<Parent>
{
    public ParentMappings()
    {
        Table("Parent");
        Id(x => x.Id).Column("Parent_Id");
        ...
        HasMany(x => x.Children)
            .Not.KeyNullable()
            .Not.Inverse()
            .KeyColumn("Parent_Id")
            .Cascade.All();
        ...
    }
}

public class ChildMappings : ClassMap<Child>
{
    public ChildMappings()
    {
        Table("Child");
        Id(x => x.Id).Column("Child_Id");
        Map(x => x.ParentId).Column("Parent_Id");
        ...
    }
}

问题来了。我希望能够使用无状态会话写入父/子表,以保持速度,但也可以使用有状态会话读取表,以便正确加载Children集合。然而,这两种方法似乎是不相容的。对HasMany()的调用中断了无状态写入;删除它会破坏有状态读取。

在更广泛的上下文中,可能还有一些情况下,我希望使用有状态会话写入数据库。但在这种情况下,包含Map(x => x.ParentId).Column("Parent_Id")语句会中断有状态写入。

看起来我需要为有状态会话和无状态会话使用不同的映射。然而,我是NHibernate的新手,现阶段我看不出有什么明显的方法可以做到这一点。有人能建议一种方法或等效的解决方法吗?

NHibernate:有状态会话和无状态会话需要不同的映射

您已经将backreference映射到子级中的parent,但它应该是一个引用,而不仅仅是id。将其更改为

// in childmap
Reference(x => x.Parent).Column("Parent_Id");

然后你可以设置反向以提高的性能

// in parentmap
HasMany(x => x.Children)
        .Not.KeyNullable()
        .Inverse()
        .KeyColumn("Parent_Id")
        .Cascade.All();

则CCD_ 3和CCD_

我知道这是旧的,但

你根本不应该在Child上映射ParentId,这是一个数据库问题,会破坏你的域模型!

以下内容就足够了:

HasMany(x => x.ChildEntities).Inverse.Cascade.All();

NHibernate将自动生成您的相关ID,例如"Parent_ID"。

如果你需要一个对父级的反向引用,只需添加它。这样,混合无状态和有状态的读/写就没有问题了