1

我们的系统会生成包含用户选择的收件人/抄送/密送联系人列表的电子邮件。我想将它们按如下方式存储在我们的 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 映射文件?

4

1 回答 1

0

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

乍一看,这可能意味着您必须在域模型中创建一个 CustomerAddress 对象以在数据库中反映此关系表;NHibernate 并非如此。相反,您只需向 Customer.hbm.xml 添加一个多对多关联,这表明应该将 CustomerAddresses 表用作管理这种多对多关系的查找。

用您的“EmailContacts”替换 McCafferty 的“CustomerAddresses”示例。根据文章,您将需要一个“EmailContacts”来表示电子邮件和联系人之间的多对多关系,而不是EmailContacts域对象。如果您需要 To、CC 和 BCC 三个单独的关系,请创建三个连接表:To_EmailAddressesCC_EmailAddressesBCC_EmailAddresses

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

于 2008-11-21T19:29:44.360 回答