我在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();
}
}
答案 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)强>
我们可以将其添加到模型中
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);
事实上,这将是最简单的解决方案......将主叫方改为目标映射:
var list = ByParameter<MenuItem>("Parent.MenuItemId", 123);
因为Parent
的属性 MenuItemId (<id>
或Id()
)会显示(它是列 ParentId ) - 我们不需要加入。 NHibernate将生成可预期的简单查询