2009-06-22 3 views
0

J'adore la capacité de NHibernate à avoir une table pour stocker plusieurs types basés sur un discriminateur. Quand je récupère un RegularItem, il reviendra car le sous-type du discriminateur est correct.Subsonic et sous-tables

Est-ce que SubSonic a cette capacité?

Répondre

1

Voulez-vous dire, vous avez une table avec différentes valeurs stockées dedans, et dépendez-vous d'une valeur que vous voulez retourner différents objets?

par exemple. vous avez un animal de compagnie de table

id  type  name 
--------------------- 
1  dog  bello 
2  cat  scott 
3  cat  tiger 

et vous voulez obtenir des objets de chien et de chat? J'ai un cas similaire, et je l'ai résolu en créant une classe Dog et une classe Cat qui héritent toutes deux de la classe autogénérée subsonic et implémentent mon stub d'interface IPet, en conjonction avec une méthode factory, où je place mes objets sur nouveau Type:

public Class Dog : Pet, IPet { } 
public Class Cat : Pet, IPet { } 
public Interface IPet { } 

public static IPet GetAllPets() 
{ 

    List<IPet> pets = new List<IPet>(); 

    foreach Pet pet in PetCollection.FetchAll() 
    { 

     IPet newpet; 

     if (pet.Type == "dog") 
      newpet = new Dog(); 
     else if (pet.Type == "cat") 
      newpet = new Cat(); 
     else throw new InvalidOperationException("Unknown pet type " + pet.Type); 

     pet.CopyTo(newpet); 
     newpet.MarkOld(); 

     pets.Add(newpet); 

    } 

} 

Typée à partir de la mémoire, non garantie pour la compilation. Mais la théorie devrait être claire.

+0

J'ai légèrement modifié l'exemple, car cela ne fonctionnera pas (vous pouvez lancer un chien comme animal de compagnie, mais pas un animal de compagnie pour un chien). –

1

La réponse courte est non, SubSonic n'a pas cette fonctionnalité intégrée. Vous pourriez être en mesure de recréer cela avec ExecuteTypedList <>, mais ce serait beaucoup de travail manuel (vous réécrire probablement la plupart des fonctionnalités de la fonctionnalité NH).