【问题标题】:ExecuteSqlCommand fails in Entity Framework when the command text has a DDL and DML instruction当命令文本具有 DDL 和 DML 指令时,Entity Framework 中的 ExecuteSqlCommand 失败
【发布时间】:2018-02-13 19:02:20
【问题描述】:

在 C# 中,使用 NpgSQL 连接 Postgres 数据库,我正在尝试执行具有 DDL 和 DML 指令的唯一命令,但是该命令不起作用。

示例:

var m_comandoSQL = @"DROP TABLE IF EXISTS public.test_55;
CREATE TABLE public.test_55 ( ds_nome VARCHAR(50) );
SELECT * FROM public.test_55;";

var m_modelo = new Modelo(); // Modelo is a dbContext
m_modelo.Database.ExecuteSqlCommand(m_comandoSQL);

调用 ExecuteSqlCommand 时,引发以下异常

Npgsql.NpgsqlException (0x80004005): 42P01: 关系“public.test_55”不存在

em Npgsql.NpgsqlConnector.DoReadSingleMessage(DataRowLoadingMode dataRowLoadingMode, Boolean returnNullForAsyncMessage, Boolean isPrependedMessage)

em Npgsql.NpgsqlConnector.ReadSingleMessage(DataRowLoadingMode dataRowLoadingMode, Boolean returnNullForAsyncMessage)

em Npgsql.NpgsqlCommand.Execute(CommandBehavior 行为)

em Npgsql.NpgsqlCommand.ExecuteNonQueryInternal()

em System.Data.Entity.Infrastructure.Interception.InternalDispatcher1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func3 操作,TInterceptionContext interceptionContext,Action3 executing, Action3 执行)

em System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)

em System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)

em System.Data.Entity.Core.Objects.ObjectContext.c__DisplayClass59.b__57()

em rei_cadastros.InitializeTeste.Main(String[] args)

如果我单独执行命令,则不会发生错误。

【问题讨论】:

  • 很有可能您使用的是旧版本的 Npgsql,能否请您检查一下您使用的是哪个版本并尝试升级到 3.2.x?
  • 我正在使用 Npgl 3.0.5 版本,将尝试更新到 3.2.x
  • 升级Npgsql到3.2x版本问题解决了!谢谢!
  • 升级Npgsql到3.2x版本问题解决了!谢谢!

标签: c# postgresql entity-framework-6 npgsql


【解决方案1】:

你可以试试这个:

var m_comandoSQL = @"SET client_min_messages = error;
DROP TABLE IF EXISTS public.test_55;
CREATE TABLE public.test_55 ( ds_nome VARCHAR(50) );
SELECT * FROM public.test_55;";

var m_modelo = new Modelo(); // Modelo is a dbContext
m_modelo.Database.ExecuteSqlCommand(m_comandoSQL);

错误的原因可能是表不存在时drop table语句生成的postgres通知。

如果存在

Do not throw an error if the table does not exist. A notice is issued in this case.

【讨论】:

    【解决方案2】:

    正如 Shay Rojansky 所说,将 NpgSQL 升级到 3.2.x 版解决了问题

    【讨论】:

      猜你喜欢
      • 2018-09-11
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 2017-06-03
      • 2011-09-19
      • 2023-03-21
      相关资源
      最近更新 更多