System.InvalidOperationException: «Была сгенерирована ошибка для предупреждения «Microsoft.EntityFrameworkCore.Migrations.PendingModelChangesWarning»: модель для контекста «ApplicationDbContext» имеет ожидающие изменения. Добавьте новую миграцию перед обновлением базы данных. См. https://aka.ms/efcore-docs-pending-changes. Это исключение можно подавить или зарегистрировать, передав идентификатор события «RelationalEventId.PendingModelChangesWarning» методу «ConfigureWarnings» в «DbContext.OnConfiguring» или «AddDbContext».
Когда я создаю новую миграцию, область «Вверх» и «Вниз» пуста. Никаких изменений и нет смысла обновлять.
Дополнительно: я создал модель и отправил ее в GIT. Перед слиянием я добавил еще одну модель и обновил базу данных. После того, как предыдущий код был объединен, я вытащил и объединил их. Конфликта не было.
Расширение для SeedData:
ловить ошибку: await context.Database.MigrateAsync();
public static class SeedDataExtension
{
public static async Task ApplySeedDataAsync(this WebApplication app)
{
try
{
using var scope = app.Services.CreateScope();
var context = scope.ServiceProvider.GetRequiredService();
await context.Database.MigrateAsync();
await LocationSeedData.SeedLocationsAsync(context);
}
catch (Exception ex)
{
var logger = app.Services.GetRequiredService();
logger.LogError("{action} Fail: {errorMessage}",
nameof(ApplySeedDataAsync),
ex.Message);
throw;
}
}
}
Часть, используемая для Program.cs:
if (!isHangfireMode)
{
await app.ApplySeedDataAsync();
}
Решения, которые я пробовал:
- Я вернулся на одну миграцию и удалил ее. Я создал новую миграцию и добавил эту миграцию.
- Я удалил файл ApplicationDbContextModelSnapshot.cs, создал новую миграцию и обновил базу данных.
1. Возник конфликт в методе OnModelCreating. Модели базы данных и модели в схеме несовместимы. (Я только добавил модель, существующие модели не менял.)
2. Игнорировать ожидающие изменения:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.ConfigureWarnings(w =>
w.Ignore(RelationalEventId.PendingModelChangesWarning));
}
3. Я не могу уничтожить базу данных.
Контекст:
public interface IApplicationDbContext
{
DbSet CandidateInfos { get; }
DbSet VacancyInfos { get; }
DbSet WebsiteNews { get; }
DbSet WebsiteNewsLocalizations { get; }
DbSet Locations { get; }
DbSet LocationLocalizations { get; }
Task SaveChangesAsync(CancellationToken cancellationToken = default);
}
public class ApplicationDbContext(DbContextOptions options) : DbContext(options), IApplicationDbContext
{
public DbSet CandidateInfos => Set();
public DbSet VacancyInfos => Set();
public DbSet WebsiteNews => Set();
public DbSet WebsiteNewsLocalizations => Set();
public DbSet Locations => Set();
public DbSet LocationLocalizations => Set();
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.ConfigureWarnings(w =>
w.Ignore(RelationalEventId.PendingModelChangesWarning));
}
protected override void OnModelCreating(ModelBuilder builder)
{
builder.HasDefaultSchema("website");
builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
builder.Entity()
.HasOne(c => c.VacancyInfo)
.WithMany()
.HasForeignKey(c => c.VacancyId)
.OnDelete(DeleteBehavior.Cascade);
builder.Entity(entity =>
{
entity.HasMany(e => e.Vacancies)
.WithOne(v => v.Location)
.HasForeignKey(v => v.LocationId)
.OnDelete(DeleteBehavior.Cascade);
entity.HasMany(e => e.Localizations)
.WithOne(l => l.Location)
.HasForeignKey(l => l.LocationId)
.OnDelete(DeleteBehavior.Cascade);
});
builder.Entity(entity =>
{
entity.HasOne(e => e.Location)
.WithMany(l => l.Localizations)
.HasForeignKey(e => e.LocationId)
.OnDelete(DeleteBehavior.Cascade);
});
builder.Entity(entity =>
{
entity.HasOne(e => e.Location)
.WithMany(l => l.Vacancies)
.HasForeignKey(e => e.LocationId)
.OnDelete(DeleteBehavior.Restrict);
});
builder.Entity(entity =>
{
entity.HasOne(e => e.WebsiteNews)
.WithMany(w => w.Localizations)
.HasForeignKey(e => e.WebsiteNewsId)
.OnDelete(DeleteBehavior.Cascade);
});
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... during-run
Мобильная версия