2008-11-21 7 views
1

Notre système génère des e-mails avec des listes de contacts To/CC/BCC choisies par l'utilisateur. Je voulais les stocker comme suit dans notre base de données SQL Server, voici la structure de la table de base de données simplifiée:Mappage d'une classe avec plusieurs propriétés de collection contenant le même type d'objet

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]) 
) 

Ce me ressemble à un cas d'un grand nombre à plusieurs entre le courrier électronique et les objets de contact. Cependant, je voudrais l'objet de domaine Email pour avoir 3 propriétés IList distinctes pour les contacts de chaque liste (A/CC/BCC) de telle sorte que je puisse activer le code suivant au travail:

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

peut-il être fait sans ajouter un objet de domaine supplémentaire (EmailContact)? Ai-je besoin d'utiliser deux relations plusieurs-à-un avec un objet de domaine supplémentaire comme Billy McCafferty mentions here?

De même, comment représenterais-je mon fichier de mappage NHibernate?

+0

Je n'ai pas eu de réponse ici, j'ai donc posté sur [NHUsers] (http://groups.google.com/group/nhusers) à la place, et j'ai reçu [2 suggestions] (http: // groups .google.com/group/nhusers/browse_thread/thread/f089bfb112380da0) - Je pense que nous allons avec l'idée de Jon Stelly. –

Répondre

0

Selon l'article que vous citez par Billy McCafferty:

À première vue, cela pourrait impliquer que vous auriez à créer un objet CustomerAddress dans votre modèle de domaine pour refléter cette table de relation dans le DB; ce n'est pas le cas avec NHibernate. Au lieu de cela, vous ajoutez simplement une association many-to-many au fichier Customer.hbm.xml qui indique que la table CustomerAddresses doit être utilisée comme référence pour gérer cette relation many-to-many.

Remplacez l'exemple "CustomerAddresses" de McCafferty par votre "EmailContacts". Selon l'article, vous aurez besoin d'un "EmailContacts" table pour représenter la relation many-to-many entre les e-mails et les contacts, mais pas un objet domaine EmailContacts. Si vous souhaitez trois relations distinctes pour To, CC et BCC, créez trois tables de jointure: To_EmailAddresses, CC_EmailAddresses et BCC_EmailAddresses. Je ne suis pas totalement familier avec NHibernate, donc je ne sais pas exactement comment mettre à jour le fichier de mapping, mais l'article indique que le fichier relatif à votre objet Email domaine (Email.hbm.xml) serait celui mettre à jour. La documentation NHibernate devrait vous indiquer comment représenter une relation plusieurs-à-plusieurs dans un fichier de mappage.

+0

Mais l'article me fait penser qu'un objet EmailContact est nécessaire parce que j'ai une propriété "Type", et il déclare que "Quand cela se produit, des mesures doivent être prises pour" mettre à niveau "cette relation many-to-many vers un objet domaine avec deux relations plusieurs-à-un ". –