为什么 CreateSQLQuery 抛出异常“值 System.Object[] 不是类型,不能在此通用集合中使用”?

1 c# nhibernate

我有以下数据库表:

CREATE TABLE A
(
[Id]    [INT] IDENTITY (1,1) NOT NULL CONSTRAINT A_P_KEY PRIMARY KEY,
[X] [INT]
)
Run Code Online (Sandbox Code Playgroud)

以下是实体类:

public class A
{
    public virtual int Id { get; set; }
    public virtual int X { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以下是映射:

internal class AConfiguration : ClassMapping<A>
{
    public AConfiguration()
    {
        Table("A");

        Id(x => x.Id, im =>
        {
            im.Column("Id");
            im.Generator(Generators.Identity);
        });
        Property(x => x.X, map => map.NotNullable(true));
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我的调用方式CreateSQLQuery

List<A> lst = null;
using(var session = SessionFactory.OpenSession())
{
    lst = session.QueryOver<A>().List<A>().ToList();//This works

    var sql = @"SELECT Id, X FROM A";
    lst = session.CreateSQLQuery(sql).List<A>().ToList();//This fail
}
Run Code Online (Sandbox Code Playgroud)

如上图所示,QueryOver调用正常。但CreateSQLQuery调用失败并出现以下异常:

System.ArgumentException was unhandled
  HResult=-2147024809
  Message=The value "System.Object[]" is not of type "[....].A" and cannot be used in this generic collection.
Parameter name: value
  ParamName=value
  Source=mscorlib
  StackTrace:
       at System.ThrowHelper.ThrowWrongValueTypeArgumentException(Object value, Type targetType)
       at System.Collections.Generic.List`1.System.Collections.IList.Add(Object item)
       at NHibernate.Util.ArrayHelper.AddAll(IList to, IList from)
       at NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery, QueryParameters queryParameters, IList results)
       at NHibernate.Impl.AbstractSessionImpl.List(NativeSQLQuerySpecification spec, QueryParameters queryParameters, IList results)
       at NHibernate.Impl.AbstractSessionImpl.List[T](NativeSQLQuerySpecification spec, QueryParameters queryParameters)
       at NHibernate.Impl.SqlQueryImpl.List[T]()
       at [....]
  InnerException: 
Run Code Online (Sandbox Code Playgroud)

为什么CreateSQLQuery调用会抛出异常?

这个问题的答案没有帮助,因为我从表中选择所有列;该问题涉及选择有限的列。

Ami*_*shi 5

APICreateSQLQuery将返回对象数组System.Object[]。例外情况是尝试将此对象数组与您的实体映射时。

你有两种方法:

  1. 手动获取对象数组和映射

    您可以使用对象数组session.CreateSQLQuery(sql).List<Object[]>()并使用自定义逻辑进一步映射它。请参阅资源了解更多详细信息。

  2. 指导 NHibernate 如何映射它

    NHibernate 有一个称为Transformers. 变压器有助于映射复杂的对象。您可以使用如下所示的一种:

    lst = session.CreateSQLQuery(sql)
        .SetResultTransformer(Transformers.AliasToBean<A>())
        .List<A>()
        .ToList();
    
    Run Code Online (Sandbox Code Playgroud)

    请参阅资源了解更多详细信息。