Не удалось найти таблицу при использовании нескольких схем в PostgreSQL - PullRequest
0 голосов
/ 31 января 2019

WPF PostgreSQL 11.1

Npgsql.PostgresException: '42P01: отношение "testme" не существует "

При попытке использоватьБаза данных PostgreSQL с несколькими схемами, я определил следующие строки подключения в App.config.Обратите внимание, что единственное отличие заключается в SearchPath:

 <system.data>
    <DbProviderFactories>
      <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql Server" type="Npgsql.NpgsqlFactory, Npgsql, Version=4.0.4.0, Culture=neutral" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <clear />
    <add name="localconnection" providerName="Npgsql" connectionString="Server=127.0.0.1;Port=5432;Database=chaos;User Id=postgres;Password=****;Searchpath=nova" />
    <add name="phoenixconnection" providerName="Npgsql" connectionString="Server=127.0.0.1;Port=5432;Database=chaos;User Id=postgres;Password=****;SearchPath=phoenix;" />
  </connectionStrings>

Поставщик данных Npgsql был установлен с использованием NuGet: Runtime Версия: v4.0.30319 Версия: 4.0.4.0

В PostgreSQL в схеме Phoenix:

CREATE TABLE phoenix.testme
(
    name text COLLATE pg_catalog."default" NOT NULL
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE phoenix.testme
    OWNER to postgres;

При использовании PgAdmin отображение таблицы testme работает без проблем:

select * from phoenix.testme;

Я настроил службу WCF с использованием приведенных выше строк подключения.Используя PetaPoco, я пишу следующий скрипт:

public string SayHello()
    {
        string msg;
        using (var db = new chaosDB("phoenixconnection"))
        {
            var m = db.ExecuteScalar<string>("select version()");
            msg = string.Format("Hello from {0}", m);

            m = db.ExecuteScalar<string>("select current_schema");
            msg = string.Format("{0} Current Schema is {1}", msg, m);

            var ss = db.ExecuteScalar<string>("show search_path");


            var s = db.Fetch<string>("select * from testme"); <---THIS FAILS!
            msg = string.Format("{0} I Am {1}", msg, m);

        }
        return msg;
    }

Все работает правильно до тех пор, пока не будет выполнено «select * from testme», когда я получу вышеуказанную ошибку.Примечание: ss из "show search_path" возвращает корректно с "phoenix"

ЧТО Я ДЕЛАЮ НЕПРАВИЛЬНО?Как мне заставить это работать ??

Любая помощь наиболее ценится?

1 Ответ

0 голосов
/ 31 января 2019

После долгих царапин на голове ответ стал очевидным.Сначала я сбросил search_path в базе данных.Это не помогло.Затем я перестроил POCO с помощью PetaPoco и быстро обнаружил, что не только новая таблица «testme» не была создана, но и не были какие-либо POCO.Поэтому, проверяя, файл Database.tt в PetaPoco показал, что он имеет неправильное имя ConnectionStringName.Изменение ConnectionStringName на «phoenixconnection» позволило построить POCO, но снова не удалось найти таблицу «testme».

Затем ошибка стала очевидной, как указано выше, как «phoenixconnection», так и «localconnection»были указаны в том же порту.Из предыдущей разработки у меня был PostgreSQL v10.1, работающий на том же порту, что и более новый PostgreSQL v11.1.Очевидно, первый PostgreSQL v10.1 получал соединение (а не более новый PostgreSQL v11.1).

Переход на services (services.msc) и завершение работы v10.1 и запуск Database.TT теперь далиошибка: System.InvalidOperationException: последовательность содержит более одного совпадающего элемента

Очевидно, что в версии 10.1 (которую я использовал для разработки) была только ОДНА схема, ноv11.1 имеет несколько схем.Я понимаю, что сообщение об ошибке означает, что PetaPoco просматривал несколько таблиц с одним и тем же именем таблицы, т. Е. Не различал схемы.

Итак, теперь проблема решена.

  1. Исправьте порты!Старая версия PostgreSQL с одной схемой v10.1 хранится на порту: 5432. Новая версия PostgreSQL с несколькими схемами хранится на порту 5433. Версия 1010 будет использоваться для POCO.
  2. Исправьте строки подключения вApp.config для WCF, чтобы во время выполнения WCF использовал более новую версию v11.1.После генерации оставьте POCO'ы в одиночку и сослаться на них в файле WCF.

Очевидно, PetaPoco может работать только с одной схемой при генерации своих POCO, но во время выполнения считывает строки подключения из приложения..Config WCF для выполнения его запросов и т. Д. (Таким образом, в файле App.config, где находится Database.TT, укажите PetaPoco на базу данных «development», имеющую только одну схему, но в среде WCF укажите строку подключения нановая база данных с несколькими схемами. SearchPath строки подключения IS соблюдается при запуске через Npgsql).

Было бы хорошо, если бы PetaPoco мог генерировать POCO, специфичные для схемы в несколькихсхема среды, но в настоящий момент, я думаю, что это не может: (

Добавление Примечание. Оказывается, что данный экземпляр PostgreSQL может иметь несколько Базы данных Таким образом, если строка подключения для Npgsql специфична для базы данных разработки --ie, базы данных только с одной схемой - тогдаВ процессе разработки PetaPoco отлично работает над созданием POCO.Эти POCO могут затем напрямую использоваться в проекте службы WCF и загружаться на веб-сайт IIS.Затем файлы App.config веб-сайта могут быть направлены на использование базы данных времени выполнения (снова в строке подключения) для развернутой базы данных.Все работает хорошо!:)

...