我正在尝试使用.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()函数时,它将返回包含所有列和数据的表:
当我在 Pgadmin 上运行相同的功能时,结果是:
答案 0 :(得分:1)
应该是
SELECT * from GETBYUSERNAME_VW_SYS_MENU_LANG()
代替
SELECT GETBYUSERNAME_VW_SYS_MENU_LANG()
作为新手PostgreSQL开发人员很难找到区别。
2nd返回一列,其中所有数据用逗号分隔。 1st返回表(或视图)的所有列