在通过Npgsql提供程序使用NHibernate执行存储过程时,行中找不到字段:<name>

时间:2018-02-27 09:08:03

标签: c# nhibernate npgsql

postgresql中的存储过程:

 CREATE OR REPLACE FUNCTION create_user() 
        RETURNS TABLE(id integer, name varchar(50), token varchar(50)) AS $$
        declare
        newUserId int;
        BEGIN
          INSERT INTO public.user(name) values ('User');
          newUserId = currval('user_id_seq');
          RETURN QUERY SELECT u.id, u.name, u.token FROM public.user u
                        where u.id = newUserId;
        END;
        $$ LANGUAGE plpgsql;

我有以下映射文件:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
  <sql-query name="create_user">
    <return class="User, <assembly>"  />
    select create_user()
  </sql-query>
</hibernate-mapping>

型号:

public class User
    {
        public virtual int Id { get; protected set; }
        public virtual string Name { get; set; }
        public virtual Guid Token { get; set; }        
    }

数据库:

 CREATE TABLE public."user"
    (
        id integer NOT NULL DEFAULT nextval('user_id_seq'::regclass),
        name character varying(50) COLLATE pg_catalog."default" NOT NULL,
        token character varying(50) COLLATE pg_catalog."default" NOT NULL DEFAULT (uuid_generate_v4())::text,
        CONSTRAINT user_pkey PRIMARY KEY (id)
    )

被调用的代码:

_session.GetNamedQuery(procedureName)
                .SetResultTransformer(
                    Transformers.AliasToBean(typeof(User)))
                .UniqueResult<User>();

此代码给出了一个错误:

  

&#34;在行中找不到字段:Id&#34;

来源:

  

&#34;&Npgsql的#34;

最后一帧:

  

&#34; Npgsql.BackendMessages.RowDescriptionMessage.GetFieldIndex(字符串   名)&#34;

在我打电话给数据库后,我得到了正确的回复,例如&#39;(1,&#39; name&#39;,GUID)&#39;

我做了一些调查,发现方法RowDescriptionMessage.GetFieldIndex在private _nameIndex = new Dictionary<string, int>找不到名称时抛出此异常,因为我认为这应该包含类似

的内容
 {
    {"Id", 0},
    {"Name", 1},
    ...
  }

在我的情况下,但我发现只有{"create_user", 0},所以预计会有异常。

问题是:我做错了什么?为什么&#34; create_user&#34;被放置到集合而不是行字段。

0 个答案:

没有答案