2009-03-30 6 views
2

J'ai un modèle où plusieurs classes ont une liste de types de valeurs:NHibernate: Carte même classe à plusieurs tables en fonction de parent

class Foo { public List<ValType> Vals; } 
class Bar { public List<ValType> Vals; } 

Foo et Bar ne sont pas reliés à part qu'ils contiennent tous deux ces vals. Les règles pour ajouter, supprimer, etc. les ValTypes sont différentes pour chaque classe. Je voudrais garder cette conception dans mon code.

Il y a des moments où je veux copier certains Vals d'un Foo à une barre, par exemple. Dans la base de données, chaque ValType a sa propre table, pour le garder petit, léger (il a juste l'ID parent + 2 champs), et permettre les contrôles d'intégrité. Je sais que NHibernate dit que je devrais garder mes objets aussi granulaires que la base de données, mais cela rend mon code plus laid. Le meilleur que j'ai pensé jusqu'ici est de faire des sous-classes séparées de ValType, une pour chaque parent. Ensuite, je peux cartographier ceux à ce niveau. Ensuite, je vais ajouter et supprimer la logique pour convertir automatiquement entre les sous-classes de droite, et en fait les stocker dans une liste privée qui a le bon type de sous-classe. Mais cela semblait un peu compliqué. Comment puis-je mapper cela dans NHibernate (Fluent NHibernate si possible)?

S'il vous plaît laissez-moi savoir s'il s'agit d'un doublon - Je ne suis pas sûr de savoir comment rechercher cela.

Répondre

2

Vous pouvez trouver un exemple sur la Google Code page for Fluent NHibernate.

Modèle

public class Customer 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 
} 

Schéma

table Customer (
    Id int primary key 
    Name varchar(100) 
) 

table CustomerAddress (
    CustomerID int, 
    Address varchar(100) 
) 

Mapping

public class CustomerMap : ClassMap<Customer> 
{ 
    public CustomerMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 

     WithTable("CustomerAddress", m => 
     { 
      m.Map(x => x.Address); 
     }); 
    } 
} 

Dans cet exemple, une entité est sp allumé à travers deux tables dans la base de données. Ces tables sont jointes par un un-à-un sur leurs clés. À l'aide de la fonctionnalité WithTable, vous pouvez indiquer à NHibernate de traiter ces deux tables comme une seule entité.

+0

Hmm cela serait embarrassant: P. Je vérifierai! – MichaelGG

+3

Je vois le lien n'existe plus, aimerait voir la solution – adriaanp

+0

Vous pouvez le trouver à travers la Wayback Machine (http://replay.waybackmachine.org/20090301015011/http://code.google.com/p/ fluent-nhibernate/wiki/Examples) mais je ne trouve pas le morceau de code correspondant. – Peter

3

Au niveau de la base de données une solution serait d'avoir:

Val(Id) 
Bar(Id) 
BarToVal(IdBar, IdVal) 
FooToVal(IdFoo, IdVal) 

Je ne suis pas très sûr de savoir comment seraient-elles être mises en correspondance. Peut-être quelque chose comme:

// BarMap: 
HasManyToMany(x => x.Vals).WithTableName("BarToVal"); 

// FooMap: 
HasManyToMany(x => x.Vals).WithTableName("FooToVal"); 

espère qu'il donner un sens ...

+0

Oui, je le ferais de cette façon, sauf que c'est un peu un coup de performance. Les tables sont très petites (20 octets), et le PK est toutes les colonnes (ForeignID, Field1, Field2) – MichaelGG

Questions connexes