0

Je crée un site de commerce électronique à l'aide de l'architecture S # arp. J'essaie de mapper une hiérarchie de catégories et de récupérer les catégories de niveau supérieur. J'utilise NHibernate.Linq pour cela. J'ai l'entité suivante:NHibernate.Linq compte NHibernate.QueryException: impossible de résoudre la propriété

public class Category : Entity 
{ 
    #region Properties 
    [DomainSignature] 
    [NotNullNotEmpty] 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
    public virtual int ListOrder { get; set; } 

    public virtual IList<Product> Products { get; set; } 
    public virtual IList<Category> ParentCategories { get; set; } 
    public virtual IList<Category> ChildCategories { get; set; } 
    #endregion 

    public Category() 
    { 
     Products = new List<Product>(); 
     ParentCategories = new List<Category>(); 
     ChildCategories = new List<Category>(); 
    } 
} 

avec la mise en correspondance Fluent NHibernate suivante:

public class CategoryMap : ClassMap<Category> 
{ 
    public CategoryMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 

     HasManyToMany(p => p.Products) 
      .Cascade.All() 
      .Table("CategoryProduct"); 

     HasManyToMany(c => c.ParentCategories) 
      .Table("CategoryHierarchy") 
      .ParentKeyColumn("Child") 
      .ChildKeyColumn("Parent") 
      .Cascade.SaveUpdate() 
      .AsBag(); 


     HasManyToMany(c => c.ChildCategories) 
      .Table("CategoryHierarchy") 
      .ParentKeyColumn("Parent") 
      .ChildKeyColumn("Child") 
      .Cascade.SaveUpdate() 
      .Inverse() 
      .LazyLoad() 
      .AsBag(); 
    } 
} 

Je veux récupérer les catégories racine. Je sais que j'ai huit dans ma db donc voici mon test:

[Test] 
public void Can_get_root_categories() 
{ 
    // Arrange 
    var repository = new CategoryRepository(); 

    // Act 
    var rootCategories = repository.GetRootCategories(); 

    // Assert 
    Assert.IsNotNull(rootCategories); 
    Assert.AreEqual(8, rootCategories.Count()); 
} 

Je me dis que je viens d'obtenir toutes les catégories où la liste ParentCategories est vide (initialisées dans le cteur de la catégorie). Alors, voici ma méthode dépôt:

public IQueryable<Category> GetRootCategories() 
{ 
    var session = NHibernateSession.Current; 

    // using NHibernate.Linq here 
    var categories = from c in session.Linq<Category>() 
        where c.ParentCategories.Count == 0 
        select c; 
    return categories; 
} 

Quand je lance mon test je reçois « NHibernate.QueryException: ne pouvait pas résoudre la propriété: ParentCategories.Id de: MyStore.Core.Category »

Qu'est-ce que je fais mal ?

Voici des questions connexes, mais ne résout pas tout à fait mon problème:

Fluent nHibernate: Need help with ManyToMany Self-referencing mapping

Querying a self referencing join with NHibernate Linq

Fluent NHibernate: ManyToMany Self-referencing mapping

Edit:

Je pense que le problème est lié à la .count dans l'expression Linq. This post liés à cela, mais je ne suis pas sûr de savoir comment progresser ...

Répondre

0

Got it. Le problème était dans l'expression linq. Il n'a pas aimé .Compte pour une raison quelconque. Cela pourrait être un bug dans NHibernate.Linq (NH2), mais j'entends NH3 linq est solide comme un roc.

Quoi qu'il en soit, ma solution est d'utiliser un des critères à la place:

catégories var = session.createCriteria (typeof (Catégorie)) (Restrictions.IsEmpty (• Ajoutez "ParentCategories")) .list(); Merci à un blog post by nixsolutions.com pour me mettre sur la bonne voie Tout vert à nouveau.

0

Vous devez utiliser la méthode d'extension Count() au lieu de la propriété Count. Cela fonctionne très bien dans NHibernate 2.

Cordialement Jon

+1

Salut Jon. Je reçois toujours un échec avec la même erreur msg quand j'utilise: var categories = session.Linq () .Where (c => c.ParentCategories.Count() == 0) .ToList(); (... hâte de Sharp Arch 2 :) – autonomatt

+0

Ne fonctionne pas pour moi non plus ... – Cocowalla

Questions connexes