2011-03-18 5 views
0

Y a-t-il un moyen de configurer le mappage pour une table qui ne fait pas directement référence à une autre table? En fait, c'est la référence d'une autre table dont j'ai directement une référence.Fluid NHibernate - Mappage de table détaché

C'est ce que j'ai jusqu'à présent, mais je ne suis pas sûr de savoir comment mapper le "LookupValue" dans mon modèle MetaData. Il aurait besoin de mapper à MetaData si [mdd] .DefinitionType est égal à [mdl] .LookupType et [md] .DataValue est égal à [mdl] .LookupKey.

public class MetaData { 
    public virtual long TableID { get; set; } 
    public virtual MetaDataDefinition Definition { get; set; } 
    public virtual int DefinitionID { get; set; } 
    public virtual String DataValue { get; set; } 
    public virtual MetaDataLookup LookupValue { get; set; } 

    public override bool Equals(object obj) { ... } 
    public over int GetHashCode() { ... } 
} 

public class MetaDataDefinition { 
    public virtual long ID { get; set; } 
    public virtual string DefinitionName { get; set; } 
    public virtual string DefinitionType { get; set; } 
} 

public class MetaDataLookup { 
    public virtual string Type { get; set; } 
    public virtual string LookupKey { get; set; } 
    public virtual string LookupValue { get; set; } 

    public override bool Equals(object obj) { ... } 
    public over int GetHashCode() { ... } 
} 

public class MetaDataMap : ClassMap<MetaData> { 
    public MetaDataMap() { 
     Table("PPOMetaData"); 
     CompositeId() 
      .KeyProperty(x => x.TableID, "TableID") 
      .KeyProperty(x => x.DefinitionID, "DefinitionID"); 

     References(x => x.Defintion, "DefinitionID").Not.LazyLoad().Cascade.All().Fetch.Join(); 
     Map(x => x.TableID); 
     Map(x => x.DataValue); 
    } 
} 
public class MetaDataDefinitionMap : ClassMap<MetaDataDefinition> { 
    public MetaDataDefinitionMap() { 
     Table("MetaDataDefinitions"); 
     Id(x => x.ID); 
     Map(x => x.DefinitionName); 
     Map(x => x.Type); 
    } 
} 

public class MetaDataLookupMap : ClassMap<MetaDataLookup> { 
    public MetaDataLookupMap() { 
     CompositeId() 
      .KeyProperty(x => x.LookupType) 
      .KeyProperty(x => x.LookupKey); 
     Map(x => x.LookupValue); 
    } 
} 

Idéalement, je veux le faire tourner une requête semblable à ceci:

SELECT  data.TableID, data.DefinitionID, def.DefinitionName, data.DataValue,lu.LookupValue AS DataValue 
FROM   dbo.PPOMetadata AS data 
    INNER JOIN dbo.MetaDataDefinitions AS def ON def.ID = data.DefinitionID 
    LEFT OUTER JOIN dbo.MetaDataLookup AS lu ON lu.LookupType = def.Type AND lu.LookupKey = data.DataValue 
WHERE data.TableID = 1 

En termes de capacité de mise à jour, la seule chose que je pourrais jamais créer, mettre à jour ou supprimer serait dans le MetaData table. Les définitions et les valeurs de recherche ne changeraient jamais (au moins à partir de cette partie de l'application). Le mappage du "MetaDataLookup" directement au modèle MetaData est-il possible? Si oui, quelqu'un peut-il me diriger dans la bonne direction de ce que je devrais regarder?

Merci!

Répondre

0

Je suis venu avec une solution de contournement qui semble fonctionner et pourrait prendre une partie de la complexité. Au lieu d'essayer de gérer les jointures complexes dans un ClassMap, j'ai construit une vue dans Sql Server qui fait cela pour moi. Dans mon application, j'ai construit un nouveau modèle et ClassMap pour la vue. Je n'ai encore implémenté aucune logique de mise à jour, mais je pense que la logique de mise à jour fonctionnera directement sur le modèle MetaData, tandis que la logique de lecture (qui a besoin de tous les éléments) utilisera le nouveau modèle MetaDataView. Je suis toujours curieux de savoir si des jointures complexes comme celle-ci sont possibles dans Fluent NHibernate, mais pour l'instant cette solution semble fonctionner pour moi.

Questions connexes