Всем привет, у меня такой вопрос, я использую 8 версию asp net, проект собирается в контейнере, и к нему через -volume подключается папка в которой уже происходит миграция. Вот код файла Program.cs:
using ImageCacheService.Models;
using ImageCacheService.Repositories;
using ImageCacheService.Services;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.FileProviders;
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddLogging(configure => {
configure.AddConsole();
});
builder.Services.AddScoped<IImageRepository, ImageRepository>();
builder.Services.AddScoped<IImageService, ImageService>();
WebApplication app = builder.Build();
using (IServiceScope scope = app.Services.CreateScope()) {
ApplicationDbContext dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
dbContext.Database.Migrate();
}
if (app.Environment.IsDevelopment()) {
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseStaticFiles(new StaticFileOptions {
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "Images")),
RequestPath = "/Images",
ContentTypeProvider = new FileExtensionContentTypeProvider {
Mappings = { [".avif"] = "image/avif" }
}
});
//app.UseHttpsRedirection();
app.MapControllers();
app.Run();
, appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "Data Source=Database/ImageCache.db"
}
}
ApplicationDbContext:
using Microsoft.EntityFrameworkCore;
namespace ImageCacheService.Models {
public class ApplicationDbContext : DbContext {
public DbSet<OriginalImage> OriginalImages { get; set; }
public DbSet<CloneImage> CloneImages { get; set; }
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options) {
}
protected override void OnModelCreating(ModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<OriginalImage>()
.HasIndex(o => o.OriginalName)
.IsUnique();
modelBuilder.Entity<CloneImage>()
.HasIndex(o => o.OriginalName)
.IsUnique();
modelBuilder.Entity<CloneImage>()
.HasOne<OriginalImage>()
.WithMany()
.HasForeignKey(c => c.OriginalImageId)
.OnDelete(DeleteBehavior.Cascade);
}
}
}
После сборки контейнера, через некоторое время он падает с ошибкой:
Unhandled exception. Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 5: 'database is locked'.
at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db)
at Microsoft.Data.Sqlite.SqliteDataReader.NextResult()
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior)
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader()
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery()
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)
at Microsoft.EntityFrameworkCore.Sqlite.Migrations.Internal.SqliteHistoryRepository.AcquireDatabaseLock()
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.Migrate(DatabaseFacade databaseFacade)
at Program.$(String[] args) in /App/ImageCacheService/Program.cs:line 27
info: Microsoft.EntityFrameworkCore.Migrations[20411]
Acquiring an exclusive lock for migration application. See https://aka.ms/efcore-docs-migrations-lock for more information if this takes too long.
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (12ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT COUNT(*) FROM "sqlite_master" WHERE "name" = '__EFMigrationsLock' AND "type" = 'table';
fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
Failed executing DbCommand (30,047ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE IF NOT EXISTS "__EFMigrationsLock" (
"Id" INTEGER NOT NULL CONSTRAINT "PK___EFMigrationsLock" PRIMARY KEY,
"Timestamp" TEXT NOT NULL
);
При этом, файл .db создался в той папке в которой ожидалось, также внутри контейнера этот файл виден и к нему есть доступ, всё равно падает. Не подскажете в чём может быть проблема?
p.s при запуске через Visual studio (также в контейнере, но с базой данных прямо в контейнере не через volume) всё работает