如何在 NHibernate 上创建通用映射

本文关键字:映射 创建 NHibernate | 更新日期: 2023-09-27 18:35:34

我在这里的类映射中遇到了问题。我有四张桌子:

  • 修复
  • 请求
  • 控制
  • 消息

Request 具有表的外键FixMessage,而Control具有Request的外键。基本映射工作正常,但我不想直接使用 Message 的类型映射RequestMessage之间的外键,因为我们不会使用此类 - 我们通过访问此 Message 表的各种视图进行所有插入和选择。要使用的视图将取决于存储在Fix表中的值,例如,Message101Message视图(我们不使用所有字段,并且还有其他业务特定原因导致我们不想使用表Message)。

对于指定的方案,基本思想是具有如下所示的映射:

public class Request: Entity
{
    public virtual short Number { get; set; }      
    public virtual Fix Fix { get; set; }
    public virtual IMessage Message { get; set; }
}

IMessage由所有Message类实现的接口。我尝试在Request类中使用泛型,但无济于事。也许使用MappingOverride会有所帮助?

谢谢

编辑:

为了使用Any我将用于查找对象类型的值放在Request表上,因此我的覆盖如下所示:

    public override void OverrideMapping(IClassMapper<Request> __m)
    {
        __m.Any(x => x.Envio, typeof(long), m =>
            {
                m.IdType<long>();
                m.MetaType<short>();
                m.MetaValue(101, typeof(Message101));
                m.Columns(id =>
                {
                    id.Name("MessageId");
                    id.NotNullable(true);
                }, classRef =>
                {
                    classRef.Name("MessageType");
                    classRef.NotNullable(true);
                });
                m.Access(Accessor.Property);
                m.Cascade(Cascade.None);                   
            }
        );
    }           

但是我一直收到not-null property references a null or transient value错误。有什么想法吗?

如何在 NHibernate 上创建通用映射

毕竟,我必须将鉴别器字段的引用放在Request上,这使我能够使用来自 NHibernate 的Any映射。在我看来,我在编辑问题时描述的问题与问题本身无关,因此,丹尼尔·席林提出的解决方案解决了我的问题。关于Any映射,可以在此处找到其工作原理的说明。

相关文章: