【问题标题】:How to create a generic mapping on NHibernate?如何在 NHibernate 上创建通用映射?
【发布时间】:2013-10-15 19:54:34
【问题描述】:

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

  • 修复
  • 请求
  • 控制
  • 留言

Request 具有表 FixMessage 的外键,而 Control 具有表 Request 的外键。基本映射工作正常,但我不想将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 使用选择的类之一动态实例化 Message 属性,并且选择此类类型的业务逻辑将取决于相关表中名为“Fix”的另一个值.
  • 您能否仅通过查看 Fix 外键来判断要实例化哪个 IMessage 类型,或者您是否必须实际加入 Fix 并查看另一列?如果您可以通过查看外键来判断,那么 &lt;any&gt; 映射就可以了。
  • 我只能通过外键来判断,但我不知道这个“”是如何工作的。我是用代码映射的,忘了说。
  • 你是否在构造函数中创建了 Message 的实例?或者未保存的值是特殊的,必须映射

标签: c# sql nhibernate


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多