2010-07-09 5 views
2

J'ai une classe appelée WorkingDays, cette classe nécessite une collection de dates qui sont les dates des jours fériés. Dans notre base de données, nous avons un tableau qui contient ces dates - Je veux nhibernate pour obtenir toutes ces dates et peupler la collection bankHolidays. La capture est cependant je n'ai pas une table qui représente le lien dans la base de données - il semble vraiment inutile quand tous les WorkingDays impls auront exactement la même liste de jours fériés de banque.Collection de mappage NHibernate sans clé étrangère

Alors, comment puis-je mapper cela sans avoir besoin d'ajouter une clé étrangère? J'espère que le code ci-dessous peut mieux illustrer:

public class WorkingDays : Interval 
{ 
    public ICollection<DateTime> BankHolidays 
    { 
     get; 
     private set; 
    } 
} 

Répondre

1

Y at-il une raison pour laquelle vous avez besoin cela comme une collection sur l'entité elle-même? Pourquoi ne pas avoir un référentiel séparé/DAO responsable de l'accès à cette collection? Si les données étaient assez statiques, vous pourriez probablement gagner un peu en utilisant également la mise en cache de second niveau.

+0

Je ne sais pas comment cela fonctionnera à moins que je charge le DateTimes et les transmette aux WorkingDays - mais parce qu'il hérite de l'Intervalle il n'y aurait aucun moyen de le faire. – Gareth

+0

Je suppose que cela dépend de votre utilisation; Si vous avez besoin de cette collection dans les couches en aval, vous pouvez toujours affecter cette propriété dans le cadre d'une opération de mappage, etc. – DanP

+0

Encore une réflexion ... qu'en est-il d'un IPostLoadEventListener personnalisé qui remplit la collection sur l'entité? Je n'ai jamais rien tenté de tel, mais je ne vois pas pourquoi cela ne marcherait pas. – DanP

1

Si vous avez seulement besoin d'une collection en lecture seule, vous pouvez essayer ce qui suit:

<property name="BankHolidays" type="DateTime[]" formula="(SELECT Date FROM BankHolidays)" update="false" insert="false" /> 
+0

Cela ressemble à la réponse! Merci - Je vais essayer lundi – Gareth

+0

Malheureusement, cela n'a pas fonctionné. Lors de l'utilisation de l'instruction select dans une requête comme suggéré ne retournera que le premier DateTime trouvé et pas tous – Gareth

+0

Dommage, j'ai été en fait mis à refactor de code si cela a dérangé; Je suppose que seules les valeurs scalaires sont prises en charge pour les propriétés basées sur une formule. – DanP

0

J'ai eu un similar question et pensé que je serais pour aider carillon d'autres à l'avenir.

Je ne pense pas que vous pouvez forcer NHibernate à mapper les enfants qui n'ont pas de type de relation avec le parent dans la base de données. C'est un Objet Relationnel Mapper après tout.

La solution consiste à impliquer une relation à travers la base de données. Créez une vue qui lie WorkingDays à BankHolidays. Puis ajoutez un HasMany (x => x.BankHolidays) à votre mapping WorkingDays.

Questions connexes