2010-06-07 5 views
1

J'ai une situation dans laquelle j'ai 3 tables: StockItem, Office et StockItemPrice. Le prix de chaque StockItem peut être différent pour chaque Office. J'ai créé un schéma avec 2 relations plusieurs-à-un pour lier StockItem et Office. Donc, dans mon objet domaine stockArticle J'ai une propriété:Remplir une propriété non mappée d'un objet de domaine à partir du résultat de la jointure avec Nhibernate

IList<StockItemPrice> Prices; 

qui se charge avec le prix de l'article pour chaque bureau. Cela fonctionne bien. Maintenant, j'essaie d'obtenir le prix d'un article pour un seul bureau. J'ai la requête Criteria suivante:

NHibernateSession.CreateCriteria(persistentType) 
       .Add(Restrictions.Eq("ID", id)) 
       .CreateAlias("Prices", "StockItemPrice") 
       .Add(Restrictions.Eq("StockItemPrice.Office", office)) 
       .UniqueResult<StockItem>(); 

Cela semble fonctionner correctement car le SQL qu'il génère est ce que je devrais attendre. Cependant, je ne sais pas si elle remplit StockItem.Prices avec un seul objet correctement dès que je fais référence à cette propriété NHibernate effectue une charge paresseuse de tous les prix du bureau. En outre, même si elle fonctionne, il se sent vraiment crufty avoir à accéder au prix en utilisant:

mystockitem.Prices[0].Price 

Ce que je voudrais vraiment est d'avoir un champ Price sur l'objet stockArticle et ont le prix de la vente de l'article dans ce domaine par NHibernate.

J'ai essayé d'ajouter .CreateCriteria("Price", "StockItemPrice.Price") et même avec createAlias, mais je reçois l'erreur

NHibernate.QueryException : could not resolve property: Price of: StockItem 

ce qui est logique, je suppose que le prix est pas une propriété mappée.

Comment est-ce que j'ajusterais la requête pour rendre ceci possible?

Répondre

1

Si vous êtes prêt à retirer l'ID de StockItemPrice, vous pouvez mieux gérer cela en utilisant une carte .

Déclarez votre prix de l'immobilier comme suit:

IDictionary<Office, decimal> Prices { get; set; } 

et plan comme ceci:

<map name="Prices" lazy="extra"> 
    <key column="StockItemID" /> 
    <map-key-many-to-many class="Office" column="OfficeId"/> 
    <element type="Decimal" column="Price"/> 
</map> 

accorder une attention particulière à l'attribut lazy="extra". Cela signifie quand vous faites ceci:

decimal priceInNY = item.Prices[nyOffice]; 

Seul le prix pour nyOffice (une instance Office ou proxy) seront extraites de la DB.

0

Si vous avez les prix pour tous les bureaux de la propriété Prices, pourquoi retourner à la base de données?

public virtual StockItemPrice GetPriceForOffice(Office office) 
{ 
    return Prices 
     .Where(p => o.Office.Equals(office)) 
     .SingleOrDefault(); 
} 
+0

En règle générale, je n'aurai jamais besoin de montrer les données pour un seul bureau à la fois (c'est une plate-forme de commande en ligne que les bureaux peuvent utiliser). Je suppose que si NHibernate garde les données dans son cache alors ce ne serait pas trop mauvais. Mais je ne voudrais pas ramener toutes les données sur les prix pour tous les bureaux, puis m'y retrouver pour obtenir le prix que je veux chaque fois qu'une page est chargée. –

Questions connexes