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

时间:2013-08-28 14:48:59

标签: c# nhibernate fluent-nhibernate

我正在使用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的新手,在这个阶段我无法看到明显的方法。任何人都可以建议一种方法来做到这一点,或者一个等效的解决方法吗?

1 个答案:

答案 0 :(得分: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();

然后HasManyMap(x => x.ParentId)不再在有状态会话中发生碰撞