【问题标题】:NHibernate AliasToBean transformer throws then the QueryOver alias is a private fieldNHibernate AliasToBean 转换器抛出然后 QueryOver 别名是一个私有字段
【发布时间】:2016-05-16 19:22:41
【问题描述】:

我在 VS2015 的 .net 4.5 目标项目中使用来自 NuGet 的 NHibernate 3.3.1.4000。

我有两个环境,第一个 env1 一个带有 VS2012 和 VS2015 的 windows 8.1, 第二个 env2 使用 Windows 10 并且只有 VS2015。

正如QueryOver docs 中所述,别名可能是:

在 QueryOver 中,使用空变量分配别名。该变量可以在任何地方声明(但在运行时应该为空)。然后编译器可以检查该变量的语法是否正确使用,但在运行时不会评估该变量(它只是用作别名的占位符)。

QueryOver 中的每个 Lambda 表达式函数都有一个相应的重载以允许使用别名,还有一个 .JoinAlias 函数使用别名遍历关联而不创建子 QueryOver。

所以这意味着具有 null 值的私有字段应该可以作为别名正常工作。

但是……没那么容易。

我有下一个例子:

    public void Test()
    {
        TestDto testDtoAlias = null;

        var users = GetSession()
            .QueryOver(() => _userAlias)
            .SelectList(list => list
                .Select(() => _userAlias.Id).WithAlias(() => testDtoAlias.UserId)
            )
            .TransformUsing(Transformers.AliasToBean<TestDto>())
            .List<TestDto>();
    }

    private class TestDto
    {
        public long UserId { get; set; }
    }

    private readonly User _userAlias = null;

env1 上工作得很好,但会抛出异常:

NHibernate.QueryException: could not resolve property: &lt;&gt;4__this._userAlias.Id of: User

env2 上。

注意如果我选择没有 AleasToBean 的 Id 列表:

var users = GetSession()
            .QueryOver(() => _userAlias)
            .SelectList(list => list
                .Select(() => _userAlias.Id)
            )
            .List<long>();

它在两种环境中都能正常工作。

对可能导致 env2 问题的原因有什么想法吗?

workarroud 很简单,只需在与方法相同的范围内创建别名,但我想知道我在配置中缺少什么,因为示例看起来是正确的。 :(

【问题讨论】:

    标签: c# nhibernate visual-studio-2015 queryover resulttransformer


    【解决方案1】:

    所以经过一番苦苦搜索,我找到了答案。 NHibernate 有一些 conflicts with "Roslyn" compiler,但他们在下一个版本中修复了它们 4.0.4, 3.4.1, and 3.3.5。 只需将 NHibernate 更新到此版本之一,即可解决我的问题。

    【讨论】:

      【解决方案2】:

      看到这个答案https://stackoverflow.com/a/6894010/246811

      文档可能有点含糊,但我相信它意味着范围为方法或块的变量。

      只使用局部变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 1970-01-01
        • 2016-09-04
        • 1970-01-01
        • 1970-01-01
        • 2014-02-11
        • 2020-11-12
        相关资源
        最近更新 更多