Я перехожу с SQL Server на PostgreSQL, и у меня есть веб-API, который я обновил следующим образом.
В файле appsettings.json у меня есть:
{
"ConnectionStrings": {
"MPmain": "Data Source=DESKTOP-FCT8VC2;Initial Catalog=mpau;Integrated Security=True;TrustServerCertificate=true",
"MPpostgres1": "User ID=postgres;Password=xxxxxxxx;Server=localhost;Port=5432;Database=mpau;",
"MPpostgres": "host=localhost port=5432 dbname=mpau user=postgres password=xxxxxxxx connect_timeout=10 sslmode=prefer"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
А в файле Program.cs у меня есть:
using Microsoft.EntityFrameworkCore;
using Npgsql;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
//added
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(
policy =>
{
policy.AllowAnyOrigin();
policy.AllowAnyMethod();
policy.AllowAnyHeader();
});
});
//added
builder.Services.AddDbContext<mpauDbContext>(options =>
{
builder.Configuration.GetConnectionString("MPpostgres1");
options.UseNpgsql("MPpostgres1");
});
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Мне удалось создать миграцию данных, однако, когда я пытаюсь обновить базу данных, я получаю сообщение об ошибке:
Формат строки инициализации не соответствует спецификации по индексу 0"
В файле appsettings.jsonMPmain была строкой, используемой для SQL Server (которая работала нормально), и я также попробовал поместить имя компьютера вместо localhost в строках MPpostgres1 и MPpostgres, также без изменений. MPpostgres — это строка подключения, взятая непосредственно из pgAdmin4 и скопированная/вставленная.
В большинстве результатов поиска указано, что это, скорее всего, вызвано ошибкой в строке подключения, но я попробовал несколько изменений и следовал руководству, в котором используемая строка была почти идентична (за исключением имени пользователя и пароля, и я буду пытаться Проверка подлинности Kerberos позже, чтобы удалить ее из строки подключения).
ОБНОВЛЕНИЕ: я протестировал все вышеперечисленное в версии веб-API .NET 7, включая строку подключения MPpostgres1, и смог завершить миграцию и сгенерировать таблицы. Похоже, ошибка характерна для версии веб-API .NET 8.
Любая помощь в устранении этой ошибки будет принята с благодарностью.
Изменили ли вы строку подключения при переходе с SQL Server на Postgresql? Теперь у вас есть двухпортовое приложение. Порт 1 — это соединение HTTP-клиента с сервером (интерфейсный интерфейс). Порт 2 — соединение сервера с базой данных (бэкэнд). Вы должны использовать ту же строку подключения в Postgresql, что и в SQL Server. Вы должны убедиться, что Сервер тот же. Поэтому localhost, возможно, придется сменить на IP. Учетные данные также должны быть одинаковыми. Поэтому вам необходимо убедиться, что сервер передает учетные данные клиента во внутреннюю базу данных. Мне нужно знать, что вы изменили в строке подключения.
Спасибо @jdweng за уделенное время. Я добавил в сообщение строки подключения, которые пытался использовать. MPmain — это строка, используемая для SQL-сервера, и я попробовал это после вашего комментария, но это не дало никаких изменений. Я также попытался указать имя компьютера вместо localhost в строках MPpostgres1 и MPpostgres, также без изменений. Возможно ли, что ошибка такого типа может быть вызвана совершенно другой причиной или это обязательно проблема со строкой подключения? Еще раз большое спасибо за ваше время и поддержку.
Вы должны использовать ту же строку подключения, что и SQL Server. Вы не создаете новую базу данных, а подключаетесь к той же старой базе данных. Integrated Security=True использует учетные данные пользователя. Таким образом, внешний интерфейс сервера Postgresql должен передавать учетные данные клиента во внутреннюю базу данных. Я думаю, вы хотите использовать аутентификацию SSPI. См. postgresql.org/docs/9.2/auth-methods.html
Если проблема не устранена, используйте SQL Server Management Studio для подключения к базе данных. Проверьте файл журнала в проводнике под управлением. Когда вы запустите приложение, в файле журнала появится запись об успехе/неуспехе и группе/пользователе, который пытался подключиться к базе данных. Убедитесь, что группа/пользователь та же, что и при подключении к SQL Server. Если это не то же самое, режим аутентификации postgresql неправильный.
Пожалуйста, простите мое невежество в отношении следующего вопроса, если он глупый: на самом деле я создаю новую базу данных с PostgreSQL в качестве движка. Мне удалось успешно выполнить миграцию в VS 2022, но возникла ошибка при использовании базы данных обновления для добавления новых таблиц в новую базу данных PostgreSQL. Меняет ли это ситуацию, то есть строка подключения должна отличаться от той, которая используется для SQL Server, который является другой технологией/движком БД? Еще раз прошу прощения, если вопрос покажется вам глупым, @jdweng
Строка подключения с миграцией и postgreSQL должна быть одинаковой. Вам нужно пройти миграцию. Забудьте все, что я сказал о SQL Server, поскольку вы создаете новую базу данных. Вы запускали миграцию на том же компьютере, что и ваш сервер для postresql? Как только миграция заработает, следующим шагом будет заставить строку подключения работать с клиентом. У вас может возникнуть проблема с учетными данными, если клиент и сервер находятся на разных машинах. Возможно, потребуется изменить учетные данные, которые вы используете в postresql, для работы с клиентом на другом компьютере.
Да, я использую тот же компьютер для выполнения миграции, что и сервер для Postgres. Я не использую разные машины, просто сейчас на этапе разработки. Я создал новый проект на основе .NET 8 и практически начал с нуля (только что ввел контроллеры и модели из предыдущего проекта). Миграция сработала, и она успешно сгенерирована в моем проекте в VS 2022. Это просто строка подключения, основанная на всем, чем вы поделились, и, как всегда, большое спасибо за ваше время.
Контроллер должен соответствовать учетным данным, которые вы используете в postresql. Например, если у вас есть в контроллере [Authorize], учетные данные клиента передаются на серверную часть. Postresql должен разрешить учетные данные для клиента. Какую строку подключения использует миграция?
Он использует строку MPpostgres1. Когда я выполнил «добавить миграцию» в консоли диспетчера пакетов, была создана новая папка миграции. Затем я попробовал «обновить базу данных», не меняя строку подключения, и это привело к ошибке. С тех пор я пытался изменить строку разными способами, но безуспешно, чтобы «обновление базы данных» заработало. Я еще не начал использовать [Authorize] в контроллерах, хотя использование JWT будет моим следующим шагом, как только я заработаю строку подключения. Я хотел делать все шаг за шагом и застрял на этом относительно простом шаге.
Попробуйте создать новую базу данных с миграцией, чтобы проверить, есть ли ошибки в вашей модели (или, возможно, ошибка учетных данных). Убедитесь, что вы знаете, какую строку подключения использует миграция, чтобы вы могли использовать ее с postresql. Вы также должны знать, поступают ли учетные данные для postresql от клиента. Предпочтительный метод — передать учетные данные внешнего интерфейса (клиента) на серверную часть. Когда вы используете миграцию, этого, вероятно, не происходит. Шаг первый — заставить миграцию работать. Шаг второй — получить учетные данные для работы с клиентским соединением.
См. раздел «Миграция»: developers.redhat.com/articles/2024/01/11/…
Большое спасибо @jdweng за поддержку. Я буду продолжать пытаться заставить его работать. Мы искренне ценим ваше время.
Пожалуйста, ознакомьтесь с обновлением, добавленным к исходному вопросу относительно .NET 7 и .NET 8 для дальнейших разъяснений.





Мне удалось решить проблему, изменив анализ параметров конфигурации в файле Program.cs. Решением было использовать:
options.UseNpgsql(builder.Configuration.GetConnectionString("MPpostgres1"));
вместо:
builder.Configuration.GetConnectionString("MPpostgres1");
options.UseNpgsql("MPpostgres1");
Я считаю, что это связано с тем, что конфигурация обрабатывается по-разному в разных версиях .NET. Надеюсь, это решение поможет всем, кто столкнулся с подобной ошибкой.
Просто чтобы внести ясность, закомментировав "builder.Configuration.GetConnectionString("postgres");" строка не привела к изменению, и добавление «AddEntityFrameworkNpgsql()» после «Services». в AddDbContext привело к появлению предупреждения о том, что это может вызвать какой-то конфликт, поэтому я удалил его, хотя руководство в видео, похоже, работало нормально. Однако его добавление также не решило проблему ошибки.