无法解析 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; }
解决方案
- 扩展模型
我们可以将其添加到模型中
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 列) - 我们不需要 JOIN。 NHibernate 将生成预期的简单查询
我在 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; }
解决方案
- 扩展模型
我们可以将其添加到模型中
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 列) - 我们不需要 JOIN。 NHibernate 将生成预期的简单查询