Сопоставление класса с несколькими свойствами коллекции, содержащими один и тот же тип объекта - PullRequest
1 голос
/ 21 ноября 2008

Наша система генерирует электронные письма с выбранными пользователем списками контактов 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. Однако я хотел бы, чтобы у объекта домена электронной почты было 3 отдельных свойства IList для контактов каждого списка (To / CC / BCC), чтобы можно было включить следующий код:

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

Можно ли это сделать без добавления дополнительного объекта домена (EmailContact)? Нужно ли мне использовать два отношения «многие к одному» с дополнительным доменным объектом, как Билли Маккаферти упоминает здесь ?

Кроме того, как бы мне представить этот файл сопоставления NHibernate?

1 Ответ

0 голосов
/ 21 ноября 2008

Согласно статье, которую вы цитируете, Билли Маккаферти:

На первый взгляд, это может означать, что вам потребуется создать объект CustomerAddress в вашей доменной модели, чтобы отразить эту таблицу отношений в БД; это не относится к NHibernate. Вместо этого вы просто добавили бы связь «многие ко многим» в файл Customer.hbm.xml, который указывает, что таблица CustomerAddresses должна использоваться в качестве поиска для управления этим отношением «многие ко многим».

Замените пример McCafferty "CustomerAddresses" на "EmailContacts". В соответствии со статьей вам понадобится таблица «EmailContacts» для представления связи «многие ко многим» между электронными письмами и контактами, но не объект домена EmailContacts. Если вы хотите три отдельных отношения для To, CC и BCC, создайте три таблицы соединения: To_EmailAddresses, CC_EmailAddresses и BCC_EmailAddresses.

Я не совсем знаком с NHibernate, поэтому не знаю точно, как обновить файл сопоставления, но в статье указывается, что файл, относящийся к вашему объекту домена электронной почты (Email.hbm.xml), будет Обновить. В документации NHibernate должно быть указано, как представить отношение «многие ко многим» в файле отображения.

...