我正在尝试将当前的SQL Server数据库移动到带有.net Core 2.2的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内核中出错:
“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 }); });

在PASGRESS中,我可以运行存储过程,没有任何错误,它返回预期的结果,ID列确实存在与资本字符。我已将所有表和列名转换为大写字母。
我认为应该在EF Core或Postgres存储过程的DbContext类上编辑一些内容。
------------更新-------------
有点困惑,我正在使用Dbeaver创建和测试PostgreSQL表、函数等。
当我在Dbeaver上运行SELECT GETBYUSERNAME_VW_SYS_MENU_LANG()函数时,它返回包含所有列和数据的表:
postgresql - .net Core()上的Postgresql存储过程-LMLPHP
当我在Pgadmin上运行相同的函数时,结果是:
postgresql - .net Core()上的Postgresql存储过程-LMLPHP

最佳答案

应该是

SELECT * from GETBYUSERNAME_VW_SYS_MENU_LANG()

而不是
SELECT GETBYUSERNAME_VW_SYS_MENU_LANG()

作为一个新手PostgreSQL开发人员,很难找到不同之处。
2nd返回一列,所有数据用逗号分隔。第一个返回表(或视图)的所有列

关于postgresql - .net Core()上的Postgresql存储过程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55830811/

10-16 09:42