无法解析 KeyColumn 上的 属性

Could not resolve property on KeyColumn

我在 ByParameter 的 return 上收到此错误,因为 KeyColumn 我想,我该如何解决这个问题?

could not resolve property: ParentId of: Entity.MenuItem

Entity.MenuItem.READ.ByParameter("ParentId", 3);

代码:

public static IList<T> ByParameter(String Parameter, Object Value)
{
    using (var session = NHibernateHelper<T>.OpenSession())
    {
        var conjunction = new Conjunction();

        conjunction.Add(Restrictions.Eq(Parameter, Value));

        return session.CreateCriteria(typeof(T)).Add(conjunction).List<T>();
    }
}

class MenuItemMap : Mapper<MenuItem>
{
    public MenuItemMap()
    {
        Id(x => x.MenuItemId);
        Map(x => x.Text);
        HasMany(x => x.Children).KeyColumn("ParentId").Fetch.Select();
        References(x => x.Parent).Fetch.Select();
    }
}

如果您没有使用约定来更改 Reference 方法中的列名。默认值为 Parent_id,您必须指定为 ParentId:

References(x => x.Parent).Column("ParentId").Fetch.Select();

基于 Exception 我会说,我们可以面对这个问题,以防调用方看起来像这样:

var list = ByParameter<MenuItem>("ParentId", 123);

而且因为上面的代码片段表明class MenuItem包含 ValueType (非参考) 属性 ParentId:

public class MenuItem
{
    // the <id>
    public virtual int MenuItemId { get; set; }

    // References (many-to-one)
    public virtual MenuItem Parent { get; set; }
    // this seems to be not presented on MenuItem
    // public virtual int ParentId { get; set; }

    // HasMany (one-to-many)
    public virtual IList<MenuItem> Children { get; set; }

解决方案

  1. 扩展模型

我们可以将其添加到模型中

public virtual int ParentId { get; set; }

并扩展映射

// many-to-one is using the same column - so this will be WRITABLE
References(x => x.Parent).Fetch.Select();
// just a ValueType property - READONLY
Map(x => x.ParentId)
    .Readonly() // or .Update(false).Insert(false)
     ;

现在就可以了

var list = ByParameter<MenuItem>("ParentId", 123);
  1. 只需更改参数

事实上,这将是最简单的解决方案...将调用方更改为以现有映射为目标:

var list = ByParameter<MenuItem>("Parent.MenuItemId", 123);

因为Parent的属性MenuItemId<id>Id())呈现 (它是 ParentId 列) - 我们不需要 JOIN。 NHibernate 将生成预期的简单查询