Nhibernate 使用包含相同对象类型的多个集合属性映射类

Nhibernate 使用包含相同对象类型的多个集合属性映射类,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我们的系统使用用户选择的收件人/抄送/密件抄送联系人列表生成电子邮件。我想在SQL Server数据库中按如下方式存储它们,以下是简化的数据库表结构: CREATE TABLE [Contact] ( [ContactID] [int] IDENTITY (1, 1) NOT NULL, [Name] [varchar] (100) NOT NULL, [EmailAddress] [varchar] (100) NOT NULL, CONSTRAINT [PK_

我们的系统使用用户选择的收件人/抄送/密件抄送联系人列表生成电子邮件。我想在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])
)
在我看来,这就像电子邮件和联系人对象之间的多对多关系。但是,我希望电子邮件域对象对于每个列表(to/CC/BCC)的联系人具有3个独立的IList属性,这样我就可以使以下代码正常工作:

testEmail.ToContacts.Add(contact1)
testEmail.CCContacts.Add(contact2)
testEmail.BCCContacts.Add(contact3)
是否可以在不添加其他域对象(EmailContact)的情况下完成此操作?我是否需要使用两个多对一关系和其他域对象,如


另外,如何表示我的NHibernate映射文件

根据你引用的比利·麦卡弗蒂的文章:

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

将McCafferty的“CustomerAddresses”示例替换为您的“EmailContacts”。根据这篇文章,您需要一个“EmailContacts”表来表示电子邮件和联系人之间的多对多关系,而不是
EmailContacts
域对象。如果要为收件人、抄送和密件抄送创建三个单独的关系,请创建三个联接表:
收件人电子邮件地址
抄送电子邮件地址
,以及
密件抄送电子邮件地址


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

但是这篇文章让我觉得需要EmailContact对象,因为我有一个“Type”属性,他说“当出现这种情况时,必须采取步骤”升级“这个多对多关系到一个具有两个多对一关系的域对象”。我在这里没有得到答案,所以我也发到了,我得到了-我想我们同意Jon Stelly的想法。