2010-02-18 6 views
3

avec nhibernate fluide, existe-t-il un moyen de basculer dynamiquement la table d'une cartographie à l'exécution?NHibernate fluide, changer dynamiquement Table de correspondance?

Par exemple:

public class XYClassMap : ClassMap<XY> 
{ 
    public XYClassMap() 
    { 
    Table("XYTable"); 
    Id(d => d.Id).GeneratedBy.Identity(); 
    Map(d => d.Value); 
    (...) 

Étant donné qu'il ya plusieurs plugins, chacun d'entre eux utilise cette une classe, mais ils ont besoin de travailler avec des tables différentes. Je cherche quelque chose comme ceci:

public class XY { 
    public string Tablename {get; set;} 
} 

public class XYClassMap : ClassMap<XY> 
{ 
    public XYClassMap() 
    { 
    Table(Tablename); 
    Id(d => d.Id).GeneratedBy.Identity(); 
    Map(d => d.Value); 
    (...) 

Ainsi, chaque méthode d'action pourrait travailler avec la même classe et seulement aurait besoin de définir cette propriété un « Tablename ».

Merci pour toute aide,

Steffen

Répondre

2

Mappages sont compilés au démarrage de l'application, et une fois ce qui est arrivé qu'ils ne peuvent pas être modifiés.

Si vos plugins utilisent des tables différentes, alors par définition ce ne sont pas les mêmes entités (et donc les mêmes mappages). Si vos plugins définissent tous des tables différentes qui ont toutes la même structure, vous avez besoin de mappages séparés, mais vous pourrez peut-être résumer les définitions réelles. Peut-être: chaque plugin définit son propre mapping pour cette table, qui dérive d'une classe abstraite contenant les mappings réels à l'exception du nom de la table.

public abstract class PluginMap<T> : ClassMap<T> where T : IPlugin 
{ 
    public PluginMap() 
    { 
    Id(d => d.Id).GeneratedBy.Identity(); 
    Map(d => d.Value); 
    } 
} 

public class PluginOneMap : PluginMap<PluginOne> 
{ 
    public PluginOneMap() 
    { 
    Table("PluginOne"); 
    } 
} 

public class PluginTwoMap : PluginMap<PluginTwo> 
{ 
    public PluginTwoMap() 
    { 
    Table("PluginTwo"); 
    } 
} 

Sinon, vous pouvez les définir comme des sous-classes dans une table par sous-classe ou table par héritage hiérarchie.

+0

C'est quelque chose que j'ai essayé (échoué au début et abandonné en raison de la pression de l'horaire). Merci beaucoup, je vais vérifier dès que je suis à mon PC de développement et reviendra ici;) Excellent travail, continuez! – Steffen

+0

Fantastique! Cela fonctionne parfaitement. J'ai utilisé votre idée de cartographier la classe de base générique, l'importation tous les modèles de plugins via MEF et fait le dépôt de plug-in récupérer les données comme celui-ci: Liste publique GetData (id int, string modelClassname) où T: IData { return session.Linq (modelClassname) .Where (d => d.ObjectId == id) .ToList(); } Merci pour votre inspiration, j'accepte immédiatement :) – Steffen

+0

heureux d'entendre que vous l'avez fonctionné :) –

Questions connexes