Как создать базу данных с помощью Marten при запуске приложения?

#c# #postgresql #.net-core #marten

Вопрос:

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

 services
    .AddSingleton<IDocumentStore>(DocumentStore.For(options =>
    {
        options.Connection(connectionString);
        options.DatabaseSchemaName = schemaName;
        options.Serializer(GetCustomJsonSerializer());

        options.CreateDatabasesForTenants(databaseConfig =>
        {
            databaseConfig
                .MaintenanceDatabase(connectionString) 
                .ForTenant()
                .CheckAgainstPgDatabase()
                .WithOwner(eventStoreSettings.DatabaseOwner)
                .WithEncoding(eventStoreSettings.Encoding)
                .ConnectionLimit(eventStoreSettings.ConnectionLimit);
        });
    }));
 

В документации говорится: «Если попытка подключения приводит к ошибке недопустимого каталога (3D000), запускается создание базы данных».. Прикрепленный код действительно приводит к упомянутой ошибке (3D000), но вместо запуска создания базы данных я получаю следующее необработанное исключение: «Исключение Npgsql.PostgresException (0x80004005): 3D000: база данных «UserDatabase1″ не существует
в Npgsql.NpgsqlConnector». Права пользователя, используемые в строке подключения, указаны правильно. Как использовать Marten для создания базы данных, если она не существует? Что я делаю не так?

Ответ №1:

Строка MaintenanceDatabase подключения должна отличаться от строки подключения к хранилищу данных marten. Обратите MaintenanceDatabase внимание, что для работы подключения необходимо разрешение на создание базы данных. Просто используйте корневого пользователя без какой-либо базы данных, это должно сработать. Например:

 "Host=localhost;Username=sa;Password=Pass@word"