@savva09
Начинающий .NET-ер

Почему возникает ошибка в NpgsqlConnectionStringBuilder?

Есть вот такой вот код для добавления в бд:
ContextFactory fact = new();

            WebApiContext context = fact.CreateDbContext(null);

            await context.Database.MigrateAsync();

            await context.OccurrencesData.AddAsync(result);

            await context.SaveChangesAsync();

Вот код ContextFactory:
sing Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore;

namespace WebApi.Data
{
    public class ContextFactory : IDesignTimeDbContextFactory<WebApiContext>
    {
        public WebApiContext CreateDbContext(string[] args)
        {
            var optionsBuilder = new DbContextOptionsBuilder<WebApiContext>();
            optionsBuilder.UseNpgsql("Data Source=blog.db");

            return new WebApiContext(optionsBuilder.Options);
        }
    }
}


В Swagger возвращается вот такая ошибка:
System.ArgumentException: Couldn't set data source (Parameter 'data source')
 ---> System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
   at Npgsql.NpgsqlConnectionStringBuilder.GeneratedSetter(String keyword, Object value)
   at Npgsql.NpgsqlConnectionStringBuilder.set_Item(String keyword, Object value)


где не хватает ключа и как его добавить?

Если чего не дописал, прикладываю гит: https://github.com/SavvaNasyrov/WebApi"
  • Вопрос задан
  • 697 просмотров
Решения вопроса 1
vabka
@vabka Куратор тега C#
Токсичный шарпист
Судя по стактрейсу - ты передал некорректный connection string.
Где именно - хз, ты ты не скинул ссылку на конкретный файл и конкретную строку, где произошла ошибка.
Даже стактрейс не полный.
Ну и ошибку выдаёт не сваггер

UPD: нашёл. Действительно в файле Class.cs, где у тебя фабрика объявлена, ты какую-то странную строку подключения передаёшь:
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore;

namespace WebApi.Data
{
    public class ContextFactory : IDesignTimeDbContextFactory<WebApiContext>
    {
        public WebApiContext CreateDbContext(string[] args)
        {
            var optionsBuilder = new DbContextOptionsBuilder<WebApiContext>();
            optionsBuilder.UseNpgsql("Data Source=blog.db");

            return new WebApiContext(optionsBuilder.Options);
        }
    }
}


Да и вообще обращаться к этой фабрике ты не должен - она используется только для генерации миграций.
Тебе следует доставать DbContext через DI, который ты сам же и настроил:
builder.Services.AddDbContext<WebApiContext>(options =>
    options.UseNpgsql(builder.Configuration.GetConnectionString("WebApiContext") ?? throw new InvalidOperationException("Connection string 'WebApiContext' not found.")));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы