不是nHibernate标准中的关联(Asp.Net MVC4)

时间:2014-03-11 06:05:19

标签: c# asp.net asp.net-mvc asp.net-mvc-4 nhibernate

我正在使用以下代码从表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;
        }
    }

请帮帮我..

1 个答案:

答案 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