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调用会抛出异常?
这个问题的答案没有帮助,因为我从表中选择所有列;该问题涉及选择有限的列。
APICreateSQLQuery将返回对象数组System.Object[]。例外情况是尝试将此对象数组与您的实体映射时。
你有两种方法:
手动获取对象数组和映射
您可以使用对象数组session.CreateSQLQuery(sql).List<Object[]>()并使用自定义逻辑进一步映射它。请参阅此或此资源了解更多详细信息。
指导 NHibernate 如何映射它
NHibernate 有一个称为Transformers. 变压器有助于映射复杂的对象。您可以使用如下所示的一种:
lst = session.CreateSQLQuery(sql)
.SetResultTransformer(Transformers.AliasToBean<A>())
.List<A>()
.ToList();
Run Code Online (Sandbox Code Playgroud)
请参阅此资源了解更多详细信息。
| 归档时间: |
|
| 查看次数: |
1763 次 |
| 最近记录: |