【问题标题】:one-to-one NHibernate mapping一对一的 NHibernate 映射
【发布时间】:2013-02-25 19:05:40
【问题描述】:

过去 3 天我一直在做这个,但仍然无法弄清楚。从概念上讲,我需要设计一个信封对象及其往返地址(对象)。我有以下数据库架构(我无法更改):

表格信封

  • 信封 ID (PK)
  • 列表项
  • 邮戳日期

表地址

  • EnvelopeId(信封中的PK、FK)
  • AdressType(1 - 发件人地址,2 - 收件人地址)
  • 街道
  • 状态
  • 邮政编码

*唯一约束 (EnvelopeId, AdressType)

我的课如下:

public class Envelope
{
public virtual long EnvelopeId { get; set; }
public virtual DateTime PostmarkDate { get; set; }
public virtual Address FromAddress { get; set; }
public virtual Address ToAddress { get; set; }
}


public class Address
{
public virtual AddressId { get; set; }
public virtual Envelope Envelope { get; set; }
public virtual AdressType { get; set; }
public virtual Street { get; set; }
public virtual State { get; set; }
public virtual ZipCode { get; set; }
}

所以,Envelope 最终有 2 个对应的地址条目(带有它的主键):一个带有 AddressType 1,一个带有 AddressType 2。我没有包含我的映射文件,因为这就是问题所在。我尝试了几种解决方案:

  1. 信封和地址之间的一对一关系。我在信封映射文件中有 2 个一对一的标签,在地址映射文件中有一个一对一的标签。地址映射文件也有一个外部生成器,并且信封上有一个 constrained="true"。 NHibernate 抱怨信封和地址之间的一对一映射令人困惑。

  2. 创建了 2 个 FromAddress 和 ToAddress 类,它们都派生自 Address。 Envelope 类现在有一个 FromAddress 和一个 ToAddress(而不是 2 个地址)。我为继承实现了每类表的层次结构。在我的地址映射中,我有:一个外部生成器、2 个子类标签、鉴别器值以及与信封的一对一关系。但是 NHibernate 抱怨不喜欢将鉴别器和一对一放在一起。因此,我将一对一的标签移到了子类标签中。现在 NHibernate 抱怨不知道 Envelope 属性是什么(“无法解析属性:Envelope”)

任何帮助将不胜感激。

【问题讨论】:

  • 您的课程不符合您的表格。在信封中,删除地址字段。 adressFrom 和 addressTo 变量将有(应该有)一个指向信封的指针。
  • 我确实希望在我的课程中在信封和地址之间建立双向关系。关系是Envelope 有一个Address From 和一个Address To,并且这些地址属于Envelope。充其量,我可以在没有来自 Address 的 Envelope 成员变量的情况下生活,但我无法从 Envelope 类中删除 FromAddress 和 ToAddress 成员变量。感谢您的回复。
  • 您是使用 XML 映射还是通过代码或 Fluent 进行映射?
  • 我正在使用 XML 映射

标签: nhibernate one-to-one


【解决方案1】:

信封肯定应该是一对多的地址吗?那就是一个信封可以有多个地址(如果您将来有两个以上的地址,这将证明您的代码)

但是我不知道为什么你没有发布你的映射,所以你不能让table-per-subclass(使用鉴别器)工作。您不需要从地址到信封的双向引用,因为地址继承自信封。

【讨论】:

  • 感谢您查看此内容。我需要在现有数据库之后为我的类建模 - 我无法更改其架构。从概念上讲,信封具有发件人地址和收件人地址。它没有多个地址,我认为这在未来不会改变。地址不继承自信封。信封“有一个”发件人地址,而信封“有一个”收件地址。这不是继承关系。我必须创建 2 个类:从 Address 继承的 FromAddress 和 ToAddress 只是为了使这项工作......不幸的是我不能。我得到:“无法解析属性:信封”在保存时间
  • 这是我的代码:linklink
  • 我对hibernate不是很熟悉,但是我认识到了这个问题,所以我可能会让你走上正轨,希望高手进一步解释。看起来你必须在地址定义中预先定义信封,这是编程时常见的错误,所以我希望这会有所帮助。
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
相关资源
最近更新 更多