Команда Update-Database не работает в ASP.Net Core / Entity Framework 6, поскольку объект в базе данных уже существует

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

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

 System.Data.SqlClient.SqlException: There is already an object named 'ClientsAndTestimonials' in the database.    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
    at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName)
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
    at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, String executeMethod, IReadOnlyDictionary`2 parameterValues, Boolean openConnection, Boolean closeConnection) 
    at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues, Boolean manageConnection) 
    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.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.DatabaseUpdateCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args)
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args)
 ClientConnectionId:d89989a8-ce8b-4167-be7e-fcddc4bcdf98
 Error Number:2714,State:6,Class:16
 There is already an object named 'ClientsAndTestimonials' in the database. 

Я пытался решить эту проблему в течение последних нескольких дней. Большинство коллег-разработчиков предлагают некоторые варианты использования Add-migration "Reset" -IgnoreChanges, например John Salewski, по следующей ссылке.

Тем не менее, я получаю сообщение об ошибке "Не удается найти параметр, который соответствует имени параметра" IgnoreChanges "".

Любые предложения будут ценны!

6 ответов

Решение

Во-первых, это не EF 6, это EF Core. В настоящее время в EF Core нет -IgnoreChanges (см. Здесь), но вы можете получить эквивалент, закомментировав весь код в методе Up() и применив миграцию. Это сделает снимок текущего состояния модели, так что последующие миграции будут включать только изменения с этого момента.

Поэтому, если вы только что внесли какое-то постепенное изменение модели и у вас нет этой исходной базовой линии, вам может потребоваться удалить эти изменения, применить базовую миграцию, затем добавить свои изменения обратно и добавить 2-ю миграцию.

Ответ: НЕ ИСПОЛЬЗУЙТЕ Update-Database И ОДНОВРЕМЕННО.

В EF 6 эта проблема решена с помощью флага -IgnoreChanges. Это описано здесь .

В EF Core 5 нет флага -IgnoreChanges, а в EF Core 5 есть два сценария миграции.

СЦЕНАРИЙ 1.

На ранней стадии разработки мы можем использовать пару методов: Database.EnsureDeleted () и Database.EnsureCreated()Database.EnsureCreated () .

Поэтому мы должны использовать эти методы в конструкторе контекста, например:

      public MyContext(DbContextOptions<MyContext> options) : base (options)
{
    Database.EnsureDeleted();
    Database.EnsureCreated();
}

Метод EnsureDeleted () удалит нашу базу данных. Метод EnsureCreated () воссоздает нашу базу данных. Все данные, хранящиеся в базе данных, будут потеряны. Обратите внимание, что EnsureDeleted () и EnsureCreated () будут работать, только если наша модель данных будет изменена.

Этот сценарий подходит на ранней стадии разработки, когда мы можем разрешить воссоздание БД в каждом запущенном приложении после изменения нашей модели данных.

СЦЕНАРИЙ 2.

Мы также можем использовать ручное обновление базы данных. Для этого нам нужно использовать Add-Migration и Update-Database в диспетчере пакетов.

После добавления миграции инструмент EF создает новый класс миграции с методами void Up (MigrationBuilder migrationBuilder) и void Down (MigrationBuilder migrationBuilder).

После этого мы должны использовать Update-Database, что позволит нам изменить нашу базу данных.

Когда мы используем Add-Migration-Update-Database и EnsureDeleted () - EnsureCreated () одновременно, мы получаем ошибку «в базе данных уже есть объект с именем Entity name». »При обновлении шага базы данных. Как сказал Стив Грин , мы можем удалить весь сгенерированный код, используя методы Up и Down. И это будет полезно, но мы должны это сделать после всех изменений в нашей модели данных.

Используйте Alter column вместо AddColumn в функции up()

    migrationBuilder.AlterColumn<bool>(
        name: "IsActive",
        table: "Advertisements",
        nullable: false,
        defaultValue: true);

Или

      public override void Up()
      {
        AddColumn("dbo.Products", "Description", c => c.String(maxLength: 50));
      }

asp.net миграция

Вы можете отметить некоторые части в функции up, если вы не хотите полностью влиять на базу данных.

Если ваша команда миграции недовольна созданием тех. Сбросить и перенастроить миграцию. Как: удалить содержимое миграции как из visualstudio, так и из sql иadd-migration снова и update-database

У меня есть эта проблема с правильным добавлением миграции и правильным обновлением базы данных без ошибок, и я говорю мне «Готово» в проекте .NET 6, но он не создал базу данных на сервере sql. Моя проблема решена путем изменения параметров строки подключения.

      "trustServerCertificate=true;Encrypt=False"

и после создания базы данных в моем классе DBContext я использовал:

      Database.EnsureCreated();

Чтобы избежать повторного создания базы данных после создания

Для этого помогли:

  1. закомментируйте весь метод Up() исходного файла миграции
  2. запустить приложение
  3. в базе данных в EFMigrationsHistory создается первая запись
  4. я изменил метод Up() на исходный
  5. запустите приложение снова, и ошибка исчезнет

у меня работало локально и на сервере.

Номер ошибки:2714, состояние:6, класс:16 В базе данных уже есть объект с именем «Сотрудник».

Я просто решаю, выдаваемый методом перехода к методу миграции, и комментирую код сотрудника, который следует

      migrationBuilder.CreateTable(
                name: "Employee",
                columns: table => new
                {
                    Eid = table.Column<int>(type: "int", nullable: false),
                    FirstName = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
                    LastName = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
                    Salary = table.Column<decimal>(type: "money", nullable: false),
                    Gender = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true),
                    Did = table.Column<int>(type: "int", nullable: true),
                    Email = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true),
                    ConfirmEmail = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true),
                    LnKdProfile = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Employee", x => x.Eid);
                });

Шаг: затем я запускаю команду update-database, она выполняется успешно, выдает ошибку, потому что таблица Employee уже присутствует в моей базе данных, поэтому мы не можем создать новую таблицу с тем же именем.

Другие вопросы по тегам