如何在NHibernate上创建通用映射?

时间:2013-10-15 19:54:35

标签: c# sql nhibernate

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

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

Request具有表FixMessage的外键,而Control具有Request的外键。基本映射工作正常,但我不想直接用Request的类型映射MessageMessage之间的外键,因为我们不会使用这个类 - 我们进行所有插入并通过各种视图选择加入此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错误。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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