Почему во время выполнения проекта возникла проблема с миграцией SeedData?C#

Место общения программистов C#
Ответить
Anonymous
 Почему во время выполнения проекта возникла проблема с миграцией SeedData?

Сообщение Anonymous »

Я добавил модель и ее SeedData. При добавлении миграции или обновлении базы данных проблем не возникло. SeedData также без проблем сохранилась в базе данных. Но во время выполнения проекта возникла проблема с этой ошибкой:

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, создал новую миграцию и обновил базу данных.
Решения, предоставленные ChatGPT:
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»