无法解析KeyColumn上的属性

时间:2015-05-03 21:31:59

标签: c# nhibernate fluent-nhibernate

我在ByParameter返回时收到此错误,原因是KeyColumn我想,我该怎么做才能做到这一点?

  

无法解析属性:ParentId: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();
    }
}

1 个答案:

答案 0 :(得分:1)

基于Exception,我会说,我们可以面对这个问题 - 主叫方看起来像这样:

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

因为上面的代码段表明 class MenuItem包含 ValueType (非-reference)属性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; }

<强>将(S)

  1. 扩展模型
  2. 我们可以将其添加到模型中

    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. 只需更改参数
    2. 即可

      事实上,这将是最简单的解决方案......将主叫方改为目标映射:

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

      因为Parent的属性 MenuItemId <id>Id())会显示(它是列 ParentId - 我们不需要加入。 NHibernate将生成可预期的简单查询