我们的系统使用用户选择的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])
)
对我而言,这看起来像是Email和Contact对象之间的多对多关系。但是,我希望电子邮件域对象为每个列表的联系人(To / CC / BCC)提供3个单独的IList属性,以便我可以启用以下代码:
testEmail.ToContacts.Add(contact1)
testEmail.CCContacts.Add(contact2)
testEmail.BCCContacts.Add(contact3)
这可以在不添加额外域对象(EmailContact)的情况下完成吗?我是否需要与Billy McCafferty mentions here等其他域对象使用两个多对一关系?
另外,我如何表示我的NHibernate映射文件?
答案 0 :(得分:0)
根据Billy McCafferty引用的文章:
乍一看,这可能意味着您必须在域模型中创建一个CustomerAddress对象,以反映数据库中的这种关系表; NHibernate的情况并非如此。相反,您只需向Customer.hbm.xml添加多对多关联,该关联指示应将CustomerAddresses表用作管理此多对多关系的查找。
用您的“EmailContacts”替换McCafferty的“CustomerAddresses”示例。根据该文章,您需要一个“EmailContacts”表来表示电子邮件和联系人之间的多对多关系,而不是EmailContacts
域对象。如果您想要To,CC和BCC三个单独的关系,请创建三个连接表:To_EmailAddresses
,CC_EmailAddresses
和BCC_EmailAddresses
。
我对NHibernate并不完全熟悉,所以我不确切知道如何更新映射文件,但文章指出与您的电子邮件域对象(Email.hbm.xml)相关的文件将是更新。 NHibernate文档应该告诉您如何在映射文件中表示多对多关系。