Не работает Update-Database (PostgreSQL) в приложении C# WPF (ЗАКРЫТ)
При выполнении команды Add-Migration [Name] -verbose всё проходит замечательно. Миграция собирается, база создаётся. Сделал правки в моделях, хочу обновить базу командой Update-Database -verbose и выдаёт следующую ошибку:
Failed executing DbCommand (0ms) [Parameters=[], CommandType = 'Text', CommandTimeout = '30']
CREATE TABLE "Roles" (
"Id" uuid NOT NULL,
"Name" text NOT NULL,
CONSTRAINT "PK_Roles" PRIMARY KEY ("Id")
);
Disposing transaction.
'AppDBContext' disposed.
Npgsql.PostgresException (0x80004005): 42P07: отношение "Roles" уже существует
at Npgsql.Internal.NpgsqlConnector.<ReadMessage>g__ReadMessageLong|215_0(NpgsqlConnector connector, Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage)
at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken)
at Npgsql.NpgsqlDataReader.NextResult()
at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlCommand.ExecuteNonQuery(Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlCommand.ExecuteNonQuery()
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)
at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String connectionString, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Exception data:
Severity: ОШИБКА
SqlState: 42P07
MessageText: отношение "Roles" уже существует
File: heap.c
Line: 1202
Routine: heap_create_with_catalog
42P07: отношение "Roles" уже существует
Нашёл что-то подобное в англоязычном сегменте стэка, но так и не понял, как исправить это.
Классы объектов:
User
public class User
{
// Код пользователя
[Required]
[Key]
public Guid Id { get; set; } = Guid.NewGuid();
// Роль пользователя
[Required]
[ConcurrencyCheck]
public Guid? RoleId { get; set; }
[ForeignKey("RoleId")]
public Role Role { get; set; }
// Изображение пользователя
[ConcurrencyCheck]
public byte[]? UserPic { get; set; }
// Имя пользователя
[Required]
[ConcurrencyCheck]
public string FirstName { get; set; }
// Отчество пользователя
[ConcurrencyCheck]
public string? MiddleName { get; set; }
// Фамилия пользователя
[ConcurrencyCheck]
[Required]
public string LastName { get; set; }
// Телефонный номер пользователя
[ConcurrencyCheck]
[Required]
public string PhoneNumber { get; set; }
// Электронная почта пользователя
[ConcurrencyCheck]
[Required]
public string Email { get; set; }
// Адрес пользователя
public string? Address { get; set; }
// Пароль пользователя
[ConcurrencyCheck]
[Required]
public string Password { get; set; }
//Активирован ли аккаунт
[ConcurrencyCheck]
[Required]
public bool IsActivated { get; set; }
}
Role
public class Role
{
// Код роли
[Required]
[Key]
public Guid Id { get; set; } = Guid.NewGuid();
// Название роли
[Required]
public string Name { get; set; }
}
AppDBContext
public class AppDBContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Role> Roles { get; set; }
public AppDBContext()
{
Database.EnsureCreated();
if (this.Users.Count() == 0 && this.Roles.Count() == 0)
{
Role adminRole = new Role() { Name = "Администратор" };
this.Roles.Add(adminRole);
User adminUser = new User() {
FirstName = [data],
MiddleName = [data],
LastName = [data],
Role = adminRole,
Email = [data],
PhoneNumber = [data],
Password = [data],
IsActivated = true
};
this.Users.Add(adminUser);
this.SaveChanges();
}
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string _currentDBHost = RegistryService.GetRegistryKeySettings("DBHost");
string _currentDBPort = RegistryService.GetRegistryKeySettings("DBPort");
string _currentDBName = RegistryService.GetRegistryKeySettings("DBName");
string _currentDBUser = RegistryService.GetRegistryKeySettings("DBUser");
string _currentDBPassword = RegistryService.GetRegistryKeySettings("DBPassword");
optionsBuilder.UseNpgsql($"Host={_currentDBHost};Port={_currentDBPort};Database={_currentDBName};Username={_currentDBUser};Password={_currentDBPassword}");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().Property(u => u.IsActivated).HasDefaultValue(false);
}
}
UPD:
Поменял на Serial, как советовали в похожем посте - не помогло
