2010-05-03 14 views
4

Quelqu'un peut-il m'aider à trouver la meilleure façon de mapper la situation suivante dans nHibernate? La classe Address est utilisée à la fois dans le client et dans la société. Comment puis-je le stocker le plus efficace en SQL? Et à quoi devrait ressembler la cartographie? J'ai pensé à plusieurs options, mais je ne suis pas assez d'expérience avec NHibernate pour ces situations:nHibernate mapping pour l'entité à plusieurs entités parentes (par exemple, Addres -> Firm, Addres -> Client)

  1. utilisation 1 entité d'adresse et 1 table et utiliser une colonne de dénominateur pour distinguer entre l'adresse pour le client et l'adresse de l'entreprise -> comment l'implémenter dans nHibernate?

  2. utilisation 1 entité d'adresses et 2 tables (ClientAddresses et CompanyAddresses) -> mais je ne peux définir 1 table dans le mappage de la classe Adresse

  3. utilisation 2 entités d'adresse et 2 tables -> non si élégant

Je viens de tomber sur ce problème lorsque j'ai commencé à implémenter la classe entreprise et j'ai réalisé qu'il avait aussi besoin de plusieurs adresses. Jusqu'à présent, j'avais une classe d'adresses et de clients et j'avais une correspondance un-à-plusieurs entre eux. Dans la base de données, l'adresse contenait une colonne supplémentaire appelée ClientId. Mais avec l'introduction de la classe Company je suis coincé ...

Toute aide serait grandement appréciée.

Je travaille actuellement dans le cadre sharparch 1.5, qui utilise AutoMapping et mes fichiers de mappage sont comme ceci:

public class AddressMap : IAutoMappingOverride<Address> 
{ 
    public void Override(AutoMapping<Address> mapping) 
    { 
     mapping.Table("addresses"); 
     mapping.Id(x => x.Id, "AddressGuid") 
      .UnsavedValue(Guid.Empty) 
      .GeneratedBy.GuidComb(); 

     mapping.References(x => x.Client, "ClientGuid"); 

    } 
} 

Ci-dessous un peu plus de code l'illustrent le problème:

Adresse

public class Address 
{ 
    public virtual string StreetLine1 { get; set; } 
    public virtual string StreetLine2 { get; set; } 
    public virtual string PostalCode { get; set; } 
    public virtual string City { get; set; } 
    public virtual string Country { get; set; } 
} 

qui a le tableau suivant:

tablename = adresses
champs = AddressGuid, StreetLine1, StreetLine2, PostalCode, Ville, Pays

client

public class Client 
{ 
    public IList<Address> Addresses {get;set;} 
} 

Société

public class Company 
{ 
    public IList<Address> Addresses {get;set;} 
} 
+0

Malheureusement j'ai exactement le même problème. Voyons voir si nous pouvons obtenir des conseils. – mhenrixon

Répondre

0

Vous pourriez modéliser les relations en tant que plusieurs-à-plusieurs: de nombreuses entreprises à plusieurs adresses, et de nombreux clients à plusieurs adresses.

Dans vos deux applications de l'entreprise et les clients:

mapping.HasManyToMany(x => x.Addresses); 

Cela va créer deux tables supplémentaires: une correspondance entre les entreprises et les adresses, une autre correspondance entre les clients et les adresses.En théorie, cela pourrait permettre des situations de partage (certaines entreprises et clients partageant tous la même ligne d'adresse) que vous ne voulez probablement pas, mais tant que la logique de votre application ne le permet pas, vous aurez sois bien et tu n'auras rien à faire avec nhibernate.

+0

Essayé mais il ne persiste pas le address_id à la table partagée – mhenrixon

+0

@mhenrixon Alors vous faites quelque chose de mal. Peut-être que vous devez définir 'Cascade.All()' sur l'association? –

+0

J'ai Cascade.SaveUpdate ensemble et j'ai essayé avec les deux inverse pas inverse à la fois la cartographie XML et fluide. – mhenrixon

1

Il semble que vous puissiez implémenter # 1 avec le mappage <any> de nHibernate. Notez que dans ce cas, vous ne pouvez pas spécifier de contraintes de clé étrangère.

an example of <any>

Fluent nHibernate syntax

+0

N'a jamais essayé. Je vois la beauté de celui-ci et peut-être que c'est le cas d'utilisation. Il dit aussi d'être très prudent avec ça et je n'ai aucune idée de ce que je fais la plupart du temps alors peut-être que ce n'est pas pour moi? :) – mhenrixon

+0

Je pense que la note "soyez prudent" est parce que vous n'obtenez pas l'intégrité référentielle (imposée dans la base de données) avec cette méthode. Tant que vous en êtes conscient, ça devrait aller. –