您好我是NHibernate的新手。我想使用连接到我的三个表来对数据库进行一次SQL查询。
我的应用程序包含许多用户的许多角色。我正在尝试让NHibernate从Application对象开始正确地形成对象图。例如,如果我有10个应用程序记录,我想要10个应用程序对象,然后这些对象具有其用户的角色。然而,我得到的东西类似于笛卡尔积,其中我有尽可能多的应用程序对象作为总用户记录。
我已经对此进行了相当多的研究,并且不确定是否可以正确地构建应用程序层次结构。我只能让扁平的物体回来。似乎“也许”可能,因为在我的研究中我已经阅读了关于“分组连接”和“分层输出”以及即将发布的LINQ到NHibernate版本。虽然我是一个新手。
[更新基于Frans在Ayende的帖子中的评论我在猜测我想做什么是不可能http://ayende.com/Blog/archive/2008/12/01/solving-the-select-n1-problem.aspx]
先谢谢你的时间。
Session.CreateSQLQuery(@"SELECT a.ID,
a.InternalName,
r.ID,
r.ApplicationID,
r.Name,
u.UserID,
u.RoleID
FROM dbo.[Application] a JOIN dbo.[Roles] r ON a.ID = r.ApplicationID
JOIN dbo.[UserRoleXRef] u ON u.RoleID = r.ID")
.AddEntity("app", typeof(RightsBasedSecurityApplication))
.AddJoin("role", "app.Roles")
.AddJoin("user", "role.RightsUsers")
.List<RightsBasedSecurityApplication>().AsQueryable();
答案 0 :(得分:1)
我刚刚发现了批处理。这应该足够好了,虽然使用连接会更好。
return Session
.CreateCriteria<RightsBasedSecurityApplication>()
.SetFetchMode("Roles", FetchMode.Select)
.List<RightsBasedSecurityApplication>().AsQueryable();
public class RightsBasedSecurityApplicationMapping: ClassMap<RightsBasedSecurityApplication>
{
public RightsBasedSecurityApplicationMapping()
{
Table("Application");
Id(x => x.ID, "ID");//.Column("ID");
Map(x => x.InternalName);
HasMany(x => x.Roles).BatchSize(10);
public class RoleMapping : ClassMap<Role>
{
public RoleMapping()
{
Table("Roles");
Id(x => x.ID, "ID");
References(x => x.Application, "ApplicationID").Not.LazyLoad();
Map(x => x.Name);
HasMany(x => x.RightsUsers).Table("UserRoleXRef").BatchSize(100);