0

Я создаю сайт электронной торговли, используя архитектуру S # arp. Я пытаюсь отобразить иерархию категорий и получить категории верхнего уровня. Я использую NHibernate.Linq для этого. У меня есть следующий объект:NHibernate.Linq count throws NHibernate.QueryException: не удалось разрешить свойство

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>(); 
    } 
} 

со следующей Fluent NHibernate отображения:

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(); 
    } 
} 

Я хочу, чтобы получить корневые категории. Я знаю, что у меня есть восемь в моем дб так вот мой тест:

[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()); 
} 

Я полагаю, что я просто получить все категории, где список ParentCategories пуст (инициализируется в CTOR из категории). Так вот мой репозиторий метод:

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; 
} 

Когда я запускаю мой тест я получаю «NHibernate.QueryException: не удалось разрешить свойство: ParentCategories.Id из: MyStore.Core.Category»

Что я делаю неправильно ?

Вот смежные вопросы, но не вполне решить мою проблему:

Fluent nHibernate: Need help with ManyToMany Self-referencing mapping

Querying a self referencing join with NHibernate Linq

Fluent NHibernate: ManyToMany Self-referencing mapping

Edit:

Я думаю, что проблема заключается с .count в выражении Linq. This post, связанный с этим, но я не уверен, как продвигаться ...

ответ

0

Got it. Проблема заключалась в выражении linq. Это не понравилось. По какой-то причине. Это может быть ошибкой в ​​NHibernate.Linq (NH2), но я слышал, что NH3 linq теперь твердый.

Во всяком случае, мое решение использовать критерии вместо:

вар категории = session.CreateCriteria (TypeOf (категория)) .Add (Restrictions.IsEmpty ("ParentCategories")) .list();

Благодаря blog post by nixsolutions.com для получения меня на правильном пути. Все зеленые снова.

0

Вы должны использовать метод расширения Count() вместо свойства Count. Это прекрасно работает в NHibernate 2.

С уважением Jon

+1

Привет Джон. Я все еще получаю сбой с той же ошибкой msg, когда я использую: var categories = session.Linq () .Where (c => c.ParentCategories.Count() == 0) .ToList(); (... с нетерпением жду Sharp Arch 2 :) – autonomatt

+0

Не работает для меня ни ... – Cocowalla

Смежные вопросы