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

问题描述 投票:0回答:2

我正在使用 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 的新手,在这个阶段我看不到一个明显的方法来做到这一点。谁能建议一种方法或等效的解决方法?

c# nhibernate fluent-nhibernate
2个回答
2
投票

您已将反向引用映射到子项中的父项,但它应该是一个引用,而不仅仅是 id。改成

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

然后你可以设置逆来提高性能

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

然后

HasMany
Map(x => x.ParentId)
在有状态会话中不再发生冲突


0
投票

我知道这很旧但是...

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

以下就够了:

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

NHibernate 将自动生成您的相关 ID,例如“Parent_id”。

如果您需要对父级的反向引用,只需添加它即可。然后你就可以毫无问题地混合无状态和有状态的读/写

© www.soinside.com 2019 - 2024. All rights reserved.