English 中文(简体)
将一个包含多个相同对象类型的集合属性的类映射。
原标题:
  • 时间:2008-11-21 19:16:26
  •  标签:

我们的系统生成由用户选择的 To / CC / BCC 联系人列表的电子邮件。我希望将它们存储在我们的 SQL Server 数据库中,以下是简化的数据库表结构:

CREATE TABLE [Contact] (
    [ContactID] [int] IDENTITY (1, 1) NOT NULL,
    [Name] [varchar] (100) NOT NULL,
    [EmailAddress] [varchar] (100) NOT NULL,
    CONSTRAINT [PK_Contact] PRIMARY KEY CLUSTERED ([ContactID])
)

CREATE TABLE [Email] (
    [EmailID] [int] IDENTITY (1, 1) NOT NULL,
    [Subject] [varchar] (500) NOT NULL,
    [Message] [text] NULL,
    [DateSent] [datetime] NOT NULL,
    CONSTRAINT [PK_Email] PRIMARY KEY CLUSTERED ([EmailID])
)

CREATE TABLE [EmailContact] (
    [EmailID] [int] NOT NULL,
    [ContactID] [int] NOT NULL,
    [Type] [varchar] (4) NOT NULL,
    CONSTRAINT [PK_EmailContactList] PRIMARY KEY CLUSTERED 
    (
        [EmailID],
        [ContactID],
        [Type]
    ),
    CONSTRAINT [FK_EmailContact_Contact] FOREIGN KEY ([ContactID]) REFERENCES [Contact] ([ContactID]),
    CONSTRAINT [FK_EmailContact_Email] FOREIGN KEY ([EmailID]) REFERENCES [Email] ([EmailID])
)

对我来说,这看起来像是电子邮件和联系人对象之间多对多关系的案例。然而,我希望电子邮件域对象拥有3个单独的IList属性,分别为每个列表的联系人(收件人/抄送人/密送人),以便我能够使用以下代码:

testEmail.ToContacts.Add(contact1)
testEmail.CCContacts.Add(contact2)
testEmail.BCCContacts.Add(contact3)

这能在不添加其他域对象(EmailContact)的情况下完成吗?我需要像Billy McCafferty在这里提到的那样使用两个多对一关系以及另一个域对象吗?

另外,我应该如何在NHibernate映射文件中表示这个问题?

问题回答

根据您引用的Billy McCafferty的文章:

乍一看,这可能意味着您需要在域模型中创建CustomerAddress对象以反映数据库中的关系表;但这并不是使用NHibernate的情况。 相反,您只需将一个多对多关联添加到Customer.hbm.xml中,该关联指示应使用CustomerAddresses表作为查找,以管理此多对多关系。

用你的“EmailContacts”替换McCafferty的“CustomerAddresses”示例。根据文章,你需要一个“EmailContacts”表来表示电子邮件和联系人之间的多对多关系,但不需要一个“EmailContacts”域对象。如果你想要三个独立的关系,即收件人、抄送和密送,请创建三个连接表:To_EmailAddressesCC_EmailAddressesBCC_EmailAddresses

我对NHibernate不是非常熟悉,因此我不知道如何准确地更新映射文件,但是文章指出与您的电子邮件域对象相关的文件(Email.hbm.xml)将是需要更新的文件。 NHibernate文档应该会告诉您如何在映射文件中表示多对多的关系。





相关问题
热门标签