NHibernate.Linq count генерирует NHibernate.QueryException: не удалось разрешить свойство - PullRequest
0 голосов
/ 23 сентября 2010

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

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 of: MyStore.Core.Category»

Чтоя делаю что-то не так?

Здесь приведены связанные вопросы, но я не совсем решил мою проблему:

Свободный nHibernate: Нужна помощь с сопоставлением самообращающихся ссылок ManyToMany

Запрос самоотносительного соединения с помощью NHibernate Linq

Свободное владение NHibernate: ManyToMany Самореферентное сопоставление

Редактировать:

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

Ответы [ 2 ]

0 голосов
/ 26 сентября 2010

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

С уважением, Джон

0 голосов
/ 24 сентября 2010

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

В любом случае, мое решение - использовать Критерии вместо:

var category = session.CreateCriteria (typeof (Category)) .Add (Restrictions.IsEmpty ( "ParentCategories")) .List ();

Спасибо за сообщение в блоге от nixsolutions.com , которое помогло мне встать на правильный путь. Все снова зеленое.

...