.net Core()上的Postgresql存储过程

时间:2019-04-24 13:07:58

标签: postgresql entity-framework .net-core entity-framework-core

我正在尝试使用.net Core 2.2将当前的SQL Server数据库移至PostgreSQL。

我将所有表(约束,索引),视图和存储过程都转换为Postgre SQL。我保留了后端数据模型的所有Dbset配置(连接字符串除外)。

我在EF Core中运行存储过程(在Postgres中)时遇到问题。存储过程返回一个视图。尝试使用Ef Core中的FromSql()方法将此视图映射到DbSet。它以前曾与SQL Server一起运行

Postgre SQL中的存储过程:

 CREATE OR REPLACE FUNCTION public.getbyusername_vw_sys_menu_lang()
 RETURNS SETOF "VW_SYS_MENU_LANG"
 LANGUAGE sql
AS $$

    --return query
    SELECT M.* FROM "VW_SYS_MENU_LANG" M
    where M."USERNAME" = 'Admin' -- parameters will be added
    limit 10;

$$;

.net Core中出现错误:

  

“ FromSql”操作的结果中没有所需的列“ ID”。

 var sql = "SELECT GETBYUSERNAME_VW_SYS_MENU_LANG()";
//var sql = "SELECT * FROM VW_SYS_MENU_LANG" //it works with view
 var result1 = dbSet.FromSql(sql) //error : The required column 'ID' was not present in the results of a 'FromSql' operation.

MyDbcontext:DbContext
   ....
   ....

 protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<VW_SYS_MENU_LANG>(e => { e.HasKey(t => new { t.ID, t.LANG }); });

在postgres中,我可以运行存储过程而不会出现任何错误,它会按预期返回结果,并且 ID 列确实存在大写字符。我已将所有表和列名称都转换为大写字母。

我认为应该在EF Core或Postgres存储过程的DbContext类上进行一些编辑。

------------ 更新 -------------

有点困惑,我在使用Dbeaver创建和测试PostgreSQL表,函数等。

当我在Dbeaver上运行 SELECT GETBYUSERNAME_VW_SYS_MENU_LANG()函数时,它将返回包含所有列和数据的表:

this link

当我在 Pgadmin 上运行相同的功能时,结果是:

Bbeaver

1 个答案:

答案 0 :(得分:1)

应该是

SELECT * from GETBYUSERNAME_VW_SYS_MENU_LANG()

代替

SELECT GETBYUSERNAME_VW_SYS_MENU_LANG()

作为新手PostgreSQL开发人员很难找到区别。
2nd返回一列,其中所有数据用逗号分隔。 1st返回表(或视图)的所有列