【发布时间】: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。我没有包含我的映射文件,因为这就是问题所在。我尝试了几种解决方案:
信封和地址之间的一对一关系。我在信封映射文件中有 2 个一对一的标签,在地址映射文件中有一个一对一的标签。地址映射文件也有一个外部生成器,并且信封上有一个 constrained="true"。 NHibernate 抱怨信封和地址之间的一对一映射令人困惑。
创建了 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