【问题标题】:NHibernate.Linq count throws NHibernate.QueryException : could not resolve propertyNHibernate.Linq 计数抛出 NHibernate.QueryException:无法解析属性
【发布时间】:2010-09-23 14:42:41
【问题描述】:

我正在使用 S#arp 架构构建电子商务网站。 我正在尝试映射类别的层次结构并检索顶级类别。 我为此使用 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();
    }
}

我想检索根类别。我知道我的数据库中有 8 个,所以这是我的测试:

[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”

我做错了什么?

以下是相关问题,但并没有完全解决我的问题:

Fluent nHibernate: Need help with ManyToMany Self-referencing mapping

Querying a self referencing join with NHibernate Linq

Fluent NHibernate: ManyToMany Self-referencing mapping

编辑:

我认为问题出在 Linq 表达式中的 .count 上。 This post 与此相关,但我不知道如何进行......

【问题讨论】:

    标签: nhibernate fluent-nhibernate many-to-many linq-to-nhibernate s#arp-architecture


    【解决方案1】:

    知道了。问题出在 linq 表达式中。它不喜欢 .Count 出于某种原因。这可能是 NHibernate.Linq (NH2) 中的错误,但我听说 NH3 linq 现在坚如磐石。

    无论如何,我的解决方案是改用 Criteria:

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

    感谢blog post by nixsolutions.com 让我走上正轨。又变绿了。

    【讨论】:

      【解决方案2】:

      您应该使用 Count() 扩展方法而不是 Count 属性。这在 NHibernate 2 中运行良好。

      问候 乔恩

      【讨论】:

      • 嗨乔恩。当我使用时,我仍然遇到同样的错误消息: var categories = session.Linq().Where(c => c.ParentCategories.Count() == 0).ToList(); (...期待 Sharp Arch 2 :)
      猜你喜欢
      • 2014-12-13
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多