我正在使用以下代码从表tMenu中获取数据。但是它返回了一个错误 “不是协会:MenuID”
public virtual IList<FOSEntities.Menu> GetMenuByRole(string RoleID)
{
try
{
ICriteria criteria = nHibernateHelper.OpenSession().CreateCriteria(typeof(FOSEntities.MenuSecurity), "MenuSecurity");
criteria.CreateAlias("MenuSecurity.MenuID", "Menu", NHibernate.SqlCommand.JoinType.InnerJoin);
criteria.CreateAlias("MenuSecurity.RoleID", "Roles", NHibernate.SqlCommand.JoinType.InnerJoin);
criteria.Add(Restrictions.Eq("Roles.RolesID", RoleID));
criteria.SetProjection(new IProjection[] { Projections.ProjectionList()
.Add(Projections.Property("Menu.MenuID"), "MenuID")
.Add(Projections.Property("Menu.MenuName"), "MenuName")
});
IList<Menu> menu = criteria.List<FOSEntities.Menu>();
return menu;
}
catch (Exception ex)
{
throw ex;
}
}
请帮帮我..
答案 0 :(得分:3)
语句criteria.CreateAlias("MenuSecurity.MenuID", ...)
似乎是(由于常见的命名约定)加入int
属性MenuID
。而这并不是关系/关联如何从NHibernate持久性发挥作用的方式。
我们需要拥有C#实体属性
public virtual Menu Menu { get; set; }
public virtual Role Role { get; set; }
// instead of
// public virtual int MenuID { get; set; }
// public virtual int RoleID { get; set; }
然后像这样加入他们:
criteria.CreateAlias("MenuSecurity.Menu", "Menu" , NHibernate.SqlCommand.JoinType.InnerJoin);
criteria.CreateAlias("MenuSecurity.Role", "Roles", NHibernate.SqlCommand.JoinType.InnerJoin);
有关详细信息,请参阅15.4. Associations