1

我有一些代码尝试访问相同的关联路径两次,它们实际上是相同的别名,但是因为我使用的是查询对象,所以我将它们放在两个不同的地方,我不确定如何获取别名.

可能是一些代码可以清除混乱:

var privateBlogQuery = new BlogQuery()
    .ByUser(1)
    .RemoveHidden()
    .FetchUserDetails();


//<-------- In Blog Query object class: ------>

/// Gets all the private blogs the user has permissions to view
public BlogQuery ByUser(int userId)
{
    var authorisedUsers = null;

    this.Left.JoinQueryOver(r => r.AuthorisedUsers, () => authorisedUsers)
        .Where(r => r.User.Id == userId);

    return this;
}

/// Removes all private blogs user has marked to be hidden
public BlogQuery RemoveHidden()
{
    var authorisedUsers = null;

    this.Left.JoinQueryOver(r => r.AuthorisedUsers, () => authorisedUsers)
        .Where(r => !r.IsHidden);

    return this;
}

/// Loads up details of all users who have permission 
/// to view the private blog
public BlogQuery FetchUserDetails()
{
    var users = null;
    var authorisedUsers = null;

    this.Left.JoinQueryOver(r => r.AuthorisedUsers, () => authorisedUsers)
        .Left.JoinQueryOver(r => r.User, () => users);

    return this;
}

有时我单独使用所有 3 个标准,而生成的 sql 正是我需要的,只要它们单独使用,一切都很好。

现在我需要一起使用它们,同时 nhibernate 抛出异常duplicate alias,我更改了这三个函数的别名,但随后我受到了欢迎duplicate association path异常。

谷歌搜索了一下,我了解到这是休眠中的一个错误,我还发现了一些解决此错误的方法

问题是我正在使用 Query 对象,因此 Query 结束了,我不确定如何在此处获取关联路径/别名。

那么我该怎么做呢?

4

1 回答 1

1
  • 制作authorisedUsers一个成员变量BlogQuery并使用标记/标志来了解是否ByUser以及RemoveHidden应该执行 Join
  • 利用JoinAlias

例子

AuthorisedUser authorisedUser;
bool authorisedUsersJoined;

public BlogQuery RemoveHidden()
{
    if (!authorisedUsersJoined)
        this.Left.JoinAlias(r => r.AuthorisedUsers, () => authorisedUser);

    this.Where(() => !authorisedUser.IsHidden);

    return this;
}

FetchUserDetails 与其他两个是互斥的,因为过滤关联会阻止 NH 初始化关联。您需要使用过滤器进行子查询并查询生成的 Id,然后进行初始化。

/// Loads up details of all users who have permission 
/// to view the private blog
public BlogQuery FetchUserDetails()
{

    this.Query = QueryOver.Of<Blog>()
        .WhereRestrictionOn(b => b.Id).IsIn(this.Query.Select(b => b.Id))
        .Fetch(r => r.AuthorisedUsers).Eager
            .ThenFetch(au => au.User).Eager;

    return this;
}
于 2013-05-10T06:36:23.533 回答