7 votes

Comment mapper une relation entité -> interface en utilisant Fluent NHibernate ?

Étant donné la définition de classe suivante :

public class Order {
  public IProduct Product {get;set;}
}

J'ai cette cartographie (fluide)

References(x=>x.Product, "ProductId");

Et recevez cette exception : Une association de la table Orders fait référence à une classe non mappée, ce qui est logique car elle ne sait pas quelle implémentation je vais lui passer.

Je comprends pourquoi je dois définir le type dans le mappage (IProduct peut être n'importe quoi) mais je ne sais pas comment le faire.

Merci,

Kyle

5voto

Stu Points 504

Je pense que ce que vous cherchez est .References<Product>(x=>x.Product, "ProductId");

Par ailleurs, il en va de même pour .HasMany<>

Cela semble faire la même chose que <... class="Product" /> en xml

Je ne recommanderais pas le mappage vers l'interface car cela casse tout l'intérêt d'en utiliser une - vous rencontrez des problèmes dès qu'elle commence à implémenter IStorable et NH ne peut pas gérer l'héritage multiple.

2voto

yfeldblum Points 42613

Essayez de mapper l'interface IProduct au lieu de la classe concrète Product . (Remarque : je ne parle pas de la mise en correspondance de l'image de l Product champ de la classe Order .)

1voto

Erik Öjebo Points 6937

Vous pourriez représenter la relation interface->implémentation comme une relation d'héritage, en utilisant un modèle d'héritage approprié.

Cela signifierait qu'il faudrait établir un mappage de IProduct, puis créer un mappage de sous-classe de Product dans le mappage de IProduct, par exemple en utilisant table-per-hierarchy.

Cela vous permettrait également de mapper des données supplémentaires dans la classe produit qui ne font pas partie de l'interface IProduct, et de mapper des implémentations IProduct supplémentaires de la même manière si vous le souhaitez.

1voto

Dave Warry Points 11

J'ai travaillé sur l'amélioration du support des interfaces proxy dans Fluent. Il y avait quelques patches utiles attachés aux problèmes 256 et 257, mais ils nécessitaient vraiment que tout soit spécifié manuellement. J'ai fait un pas de plus et j'ai ajouté le support pour définir les proxies et changer les types de références de la classe inférée (qui serait le proxy) à la classe mappée sous-jacente, et j'ai ajouté une nouvelle convention (ProxyConvention) pour configurer tout cela automatiquement - il suffit de l'instancier avec une fonction pour dériver l'interface proxy d'une classe mappée, et elle devrait s'occuper du reste.

La seule faille pour l'instant est qu'il ne peut pas récupérer les définitions spécifiées explicitement dans les fichiers .hbm.xml.

Le patch est attaché à numéro 256

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X