Web API + postgresql, Ошибка '42p01 Отношение ... не существует'

Маленький проект ASP .Net Web API, бд postgresql.

БД booksdb создана вручную в админке. Там одна таблица books, лежит в shemas.public. Несколько строк данных добавлены вручную (через интерфейс QueryTool тоже в админке)

Контекст:

public class BookStoreDbContext : DbContext
{
    public BookStoreDbContext(DbContextOptions<BookStoreDbContext> options)
            : base(options) 
    {
    }
    public DbSet<BookEntity> Books { get; set; }
}

Строка подключения:

"ConnectionStrings": {
  "BookStoreDbContext": " ......User ID=postgres;Database=booksdb;"

Ошибка:

введите сюда описание изображения

Проект собирается корректно.

Фронтенда нет, использую Сваггер, он должен вернуть строки моковых данных.

Дебаг перед ошибкой:

введите сюда описание изображения

База доступна извне, вот например из питона:

import psycopg2

conn = psycopg2.connect(dbname="books1db",
                 host="127.0.0.1",
                 user="postgres",
                 password="my_password",
                 port="5432")
cursor = conn.cursor()
query = "SELECT * FROM books"
cursor.execute(query)  
result = cursor.fetchall()
cursor.close()
conn.close()
for row in result:
    print(row)

Про эту ошибку довольно много пишут (например), но там все случаи это (1) некорректное создание бд в коде (2) некорректные запросы в коде. 'Некорректные' потому что не тот регистр либо скобки-кавычки либо надо обращаться к таблице через имя схемы. В моём случае ничего этого нет.


Ответы (1 шт):

Автор решения: Faraday

Судя по комментариям, я не очень понял, что именно ВЫ понимаете, при работе с БД и EF Core, но я решил описать несколько возможных вариантов, который теоретически должны вам помочь


Database First

Да, да, именно это. Так как вы сделали базу данных вручную через pgAdmin, вам стоит использовать подход Database First, который правильным образом сгенерирует вам Контекст базы данных и все сущности (таблицы).

Немного опишу процесс, который вам следует сделать. Исходник - тут, а ниже лишь краткая пошаговая инструкция.

Команда для выполнения через Package Manager Console:

Scaffold-DbContext "Host=localhost;Port=5432;Database=your_db;Username=your_user;Password=your_password" Npgsql.EntityFrameworkCore.PostgreSQL -OutputDir Models

Либо использовать connectionString из файла конфигураций проекта:

Scaffold-DbContext "Name=DefaultConnection" Npgsql.EntityFrameworkCore.PostgreSQL -OutputDir Models

Возможные параметры команды:

  • OutputDir Models — указывает папку для генерации моделей.
  • ContextDir Contexts - указывает папку для генерации моделей.
  • Context YourDbContext — задает имя создаваемого контекста.
  • Force — перезапись существующих файлов.

Таким образом вы сможете вытянуть все необходимые данные из существующей базы данных


Code First

Исходник статьи - тут

Вы можете сгенерировать базу данных из кода. Вы сначала делаете нужный вам класс Book, который описывает нужные вам данные в базе данных. Далее делает DbContext по этой статье и соответствующие конфигурации. После выполнения миграции у вас будет сгенерирована база данных, с которой вы сможете взаимодействовать


Так же, рекомендую прочитать о правильной регистрации Generic Repository в asp.net по этой статье

→ Ссылка