В базе данных уже есть названный объект


115

Ошибка обновления базы данных из консоли диспетчера пакетов. Я использовал Entity Framework 6.x и подход, ориентированный на код. Ошибка

«В базе данных уже есть объект с именем AboutUs».

Как я могу решить эту проблему?

internal sealed class Configuration 
    : DbMigrationsConfiguration<Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = false;
    }

    protected override void Seed(Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext context)
    {

    }
}

Мой DbContext:

public class JahanBlogDbContext : IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim>
{
    public JahanBlogDbContext()
        : base("name=JahanBlogDbConnectionString")
    {
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<JahanBlogDbContext>());
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Entity<Comment>().HasRequired(t => t.Article).WithMany(t => t.Comments).HasForeignKey(d => d.ArticleId).WillCascadeOnDelete(true);
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>().ToTable("User");
        modelBuilder.Entity<Role>().ToTable("Role");
        modelBuilder.Entity<UserRole>().ToTable("UserRole");
        modelBuilder.Entity<UserLogin>().ToTable("UserLogin");
        modelBuilder.Entity<UserClaim>().ToTable("UserClaim");
    }

    public virtual DbSet<Article> Articles { get; set; }
    public virtual DbSet<ArticleLike> ArticleLikes { get; set; }
    public virtual DbSet<ArticleTag> ArticleTags { get; set; }
    public virtual DbSet<AttachmentFile> AttachmentFiles { get; set; }
    public virtual DbSet<Comment> Comments { get; set; }
    public virtual DbSet<CommentLike> CommentLikes { get; set; }
    public virtual DbSet<CommentReply> CommentReplies { get; set; }
    public virtual DbSet<ContactUs> ContactUs { get; set; }
    public virtual DbSet<Project> Projects { get; set; }
    public virtual DbSet<ProjectState> ProjectStates { get; set; }
    public virtual DbSet<ProjectTag> ProjectTags { get; set; }
    public virtual DbSet<Rating> Ratings { get; set; }
    public virtual DbSet<Tag> Tags { get; set; }
    public virtual DbSet<AboutUs> AboutUs { get; set; }
}

Консоль управления пакетами:

PM> update-database -verbose -force
Using StartUp project 'Jahan.Blog.Web.Mvc'.
Using NuGet project 'Jahan.Blog.Web.Mvc'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'Jahan-Blog' (DataSource: (local), Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
Applying automatic migration: 201410101740197_AutomaticMigration.
CREATE TABLE [dbo].[AboutUs] (
    [Id] [int] NOT NULL IDENTITY,
    [Description] [nvarchar](max),
    [IsActive] [bit] NOT NULL,
    [CreatedDate] [datetime],
    [ModifiedDate] [datetime],
    CONSTRAINT [PK_dbo.AboutUs] PRIMARY KEY ([Id])
)
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'AboutUs' in the database.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.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, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c)
   at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
   at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
   at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
   at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection)
   at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass30.<ExecuteStatements>b__2e()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto)
   at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
   at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
   at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
   at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
   at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
   at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
ClientConnectionId:88b66414-8776-45cd-a211-e81b2711c94b
There is already an object named 'AboutUs' in the database.
PM> 

Как это сделать (сопоставление с существующим дизайном)?
Сказал Рухулла Аллем

15
@HLGEM, если «хорошо спроектированная база данных» может быть сопоставлена ​​с объектной моделью с помощью EF, то EF тоже может ее сгенерировать. Миграция БД - это мощный инструмент, который упрощает развертывание вашей базы данных. Я бы не рекомендовал избегать использования миграции БД. В противном случае скрипты патча все равно нужны. Я бы порекомендовал правильно использовать миграции БД.
Илья Палкин

Ответы:


129

кажется, что в процессе миграции возникла проблема, запустите команду add-migration в «Консоли диспетчера пакетов»:

Добавить-Migration Initial -IgnoreChanges

внесем некоторые изменения, а затем обновим базу данных из "Исходного" файла:

Обновление-База данных -verbose

Изменить: -IgnoreChanges находится в EF6, но не в EF Core, вот обходной путь: https://stackoverflow.com/a/43687656/495455


8
Что именно это делает? Позволяет ли это новой модели просто перезаписать старую?
Трэвис Таббс,

1
Я начал использовать ручную миграцию, потому что в своей базе данных использую представления, а также таблицы. Я совершил ошибку, пытаясь использовать автоматические миграции, и в результате он пытался создать таблицу из представления. В этом случае ваше решение не работает, вместо этого я должен всегда использовать ручную миграцию. Поэтому после этого мне пришлось отменить изменения в системе управления версиями и удалить запись «Initial» из таблицы _Migrations.
arame3333 03

3
Это просто заводит меня в бесконечный цикл: консоль диспетчера пакетов не позволяет мне выполнять Add-Migration, потому что выдает ошибку «Невозможно создать явную миграцию, потому что следующие явные миграции ожидают ...», а именно InitialCreate. Но если я не могу успешно запустить эту Update-Database ДО тех пор, пока не появятся некоторые Initial -IgnoreChanges, то что мне делать?
East of Nowhere

6
Add-Migration: не найден параметр, который соответствует имени параметра «IgnoreChanges».
Цви Григорий Кайданов

3
@TravisTubbs это игнорирует сделанные вами изменения и "подделывает", что ваша модель синхронизирована с базой данных в отношении таблицы миграции. Вам по-прежнему необходимо вручную синхронизировать их; В моем случае я удалил изменения, внесенные в модель, выполнил Add-Migration, удалил контент из методов up / down перед выполнением update-database - это вернуло меня в состояние до прерывания миграции. Затем я фактически повторно добавил изменения, выполнил добавление миграции и обновление базы данных, как обычно - на этот раз все синхронизировано
Дэвид Рафаэли

73

Возможно, вы изменили пространство имен в своем проекте!
В вашей базе данных есть таблица с названием dbo.__MigrationHistory. В таблице есть столбец с именем ContextKey.
Значение этого столбца основано на вашем namespace. например " DataAccess.Migrations.Configuration".
Когда вы меняете пространство имен, это вызывает дублирование имен таблиц с разными пространствами имен.
Итак, после изменения пространства имен на стороне кода, измените также пространство имен в этой таблице в базе данных (для всех строк).
Например, если вы измените пространство имен на EFDataAccess, то вы должны изменить значения ContextKeyстолбца dbo.__MigrationHistoryна " EFDataAccess.Migrations.Configuration".
Затем на стороне кода в Инструменты => Консоль диспетчера пакетов используйте update-databaseкоманду.

Другой вариант вместо изменения значения контекста в базе данных - жестко закодировать значение контекста в коде на старое значение пространства имен. Это возможно путем наследования, DbMigrationsConfiguration<YourDbContext>а в конструкторе просто присвоить старое значение контекста ContextKey, а не наследовать MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>и оставить этот класс пустым. Последнее, что нужно сделать, - это вызвать Database.SetInitializer(new YourDbInitializer());ваш DbContext в статическом конструкторе.

Надеюсь, ваша проблема будет исправлена.


9
Здорово, у нас была именно эта проблема!
Оливье РОМАН

3
Собственно это и есть настоящая причина этой ошибки. EF пытается создать базу данных, так как не может прочитать, какие миграции применяются к базе данных из-за разницы в пространстве имен
UfukSURMEN

Спасибо, этот ответ мне очень помог, как сказал Оливье РОМАН, у меня была именно эта проблема!
Энрике А. Пинело Новело

Я понятия не имел, что это было связано с этим, но каким-то образом даже удаление записей MigrationHistoryтаблицы не помогло мне ... поэтому я отбросил все свои таблицы и позволил EF создать их все заново, небольшое приложение, без особого труда. ..но это исправило для меня.
Niklas

Это правильный ответ с подробностями, также полезно упомянуть, что иногда неправильное написание имени папки вызывает эту проблему.
H35am

17

«В базе данных уже есть объект с именем AboutUs».

Это исключение сообщает вам, что кто-то уже добавил в базу данных объект с именем «AboutUs».

AutomaticMigrationsEnabled = true;может привести к этому, поскольку версии базы данных в этом случае не контролируются вами. Чтобы избежать непредсказуемых миграций и убедиться, что каждый разработчик в команде работает с одной и той же структурой базы данных, я предлагаю вам установитьAutomaticMigrationsEnabled = false; .

Автоматические миграции и кодированные миграции могут существовать вместе, если вы очень осторожны и являетесь единственным разработчиком в проекте.

Цитата из сообщения Automatic Code First Migrations в Центре разработчиков данных :

Автоматическая миграция позволяет вам использовать Code First Migrations, не имея файла кода в вашем проекте для каждого вносимого вами изменения. Не все изменения могут применяться автоматически - например, переименование столбцов требует использования миграции на основе кода.

Рекомендации для командных сред

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


12

В моем случае моя EFMigrationsHistoryтаблица была опустошена (каким-то образом), и при попытке запустить update-databaseя получал:

В базе данных уже есть объект с именем AspNetUsers.

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

Чтобы решить эту проблему, я добавил строки в свою EFMigrationsHistoryтаблицу. 1 строка для каждой миграции, которая, как я знал, обновлялась в базе данных.

В строке будет 2 столбца: MigrationIdиProductVersion

MigrationIdэто имя вашего файла миграции. Пример:20170628112345_Initial

ProductVersionэто используемая вами версия ef. Вы можете найти его, набрав Get-Packageв консоли диспетчера пакетов и найдя свой пакет ef.

Надеюсь, это кому-то поможет.


1
Как вы заполнили столбец Модель?
Киаран Галлахер

7

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

dbo.__MigrationHistory

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


5

Убедитесь, что ваш проект запуска решений имеет правильную строку подключения в файле конфигурации. Или установите параметр -StartUpProjectName при выполнении команды update-database. Параметр -StartUpProjectName указывает файл конфигурации, используемый для именованных строк подключения. Если не указано, используется файл конфигурации указанного проекта.

Вот ссылка на ссылки на команды ef-migration http://coding.abel.nu/2012/03/ef-migrations-command-reference/


Этот ответ привел меня к моей ошибке: у меня просто был неправильный проект в качестве проекта Startup.
Мартин Йоханссон

У меня была аналогичная проблема, и это решило ее для меня.
JordanTDN

3

У меня была такая же проблема, и после трех часов борьбы я узнал, что происходит

В моем случае, когда я впервые хотел выполнить миграцию в up()методе, код по умолчанию хочет создать таблицы, которые уже существуют, поэтому я получил ту же ошибку, что и вы

Чтобы решить эту проблему, просто удалите этот код и напишите, что хотите. Например, я хотел добавить столбец, поэтому просто напишу

migrationBuilder.AddColumn<string>(
            name: "fieldName",
            table: "tableName",
            nullable: true);

Похоже, хороший ответ, но вы можете проверить правописание. Вы также можете использовать фрагменты кода, чтобы было ясно, что последняя строка - это код. Напишите мне, если вам нужна помощь с этим.
Майк Пул

Спасибо, как мне сделать тебе массаж?
arfa

1
Молодцы, добавили фрагмент кода @arfa. Не нужен массаж :). Если вы хотите отправить мне сообщение, просто введите @мое имя пользователя в разделе комментариев.
Майк Пул

3

Примечание: не рекомендуемое решение. но в некоторых случаях быстрое исправление.

Для меня dbo._MigrationHistoryв производственной базе данных пропущены записи миграции во время процесса публикации, но в базе данных разработки были все записи миграции.

Если вы уверены, что рабочая база данных имеет ту же самую новую схему по сравнению с dev db, копирование всех записей миграции в производственную базу данных может решить проблему.

Вы можете работать только с VisualStudio.

  1. Откройте панель «Обозреватель объектов SQL Server»> щелкните правой кнопкой мыши dbo._MigrationHistoryтаблицу в исходной базе данных (в моем случае - dev db)> выберите меню «Сравнение данных ...».
  2. Затем появится мастер сравнения данных, выберите целевую базу данных (в моем случае - production db) и нажмите «Далее».
  3. Через несколько секунд он покажет некоторые записи только в исходной базе данных. просто нажмите кнопку «Обновить цель».
  4. В браузере нажмите кнопку обновления и увидите, что сообщение об ошибке исчезло.

Учтите, что это опять же не рекомендуется в сложных и серьезных проектах. Используйте это только у вас есть проблемы во время обучения ASP.Net или EntityFramework.


1
Это сработало для меня. Но все было наоборот. В моей производственной базе данных были все записи в __EFMigrationHistory, а в dev db были как-то пропущены (за исключением начальной).
Йенс Мандер

1

Удалите строки из таблицы dbo_MigrationHistory или удалите таблицу и запустите

update-database -verbose

Он запустит все миграции в вашем проекте одну за другой.


1

В моем случае проблема была в Сидере. Я вызывал _ctx.Database.EnsureCreated () внутри него, и, насколько я понял, команда обновления базы данных успешно выполнилась, но затем сидер попытался создать базу данных «второй» раз.

Как обращаться:

  1. Сделайте обновление, просто запустите приложение и вызовите EnsureCreated (). База данных будет создана / обновлена
  2. Закомментируйте или удалите сеялку.

1

Еще один крайний сценарий EF Core.

Убедитесь, что у вас есть файл Migrations / YOURNAMEContextModelSnapshot.cs .

как подробно описано в - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration

Если вы пытались вручную воссоздать базу данных, удалив файлы migration.cs, убедитесь, что ваш файл Migrations / * ContextModelSnapshot.cs все еще существует.

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


1

То же самое случилось со мной .. Проблема заключалась в том, что на самом деле я удалил свою таблицу базы данных MoviesCastи создал новую таблицу, и проблема заключалась в том, что моя последняя миграция пыталась вызвать удаленную таблицу MoviesCastв базе данных. Я решил это, просто удалив все содержимое последней миграции и просто запустив метод Up () & down ()

public override void Up()
{
}

public override void Down()
{
}

затем обновите базу данных и просто добавьте новую миграцию


1

У меня была та же проблема, что и в ответе, который дал Эльназ. У меня было требование изменить пространство имен слоя данных во время рефакторинга нашего проекта. Это привело к тому, что миграции не увидели существующие миграции в базе данных. Я нашел отличный ответ на этот вопрос в блоге Джеймса Чемберса.

http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/

Я просто изменил следующее в файле конфигурации миграции.

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    this.ContextKey = Old_Namespace.Migrations.Configuration”;
}

Надеюсь, это поможет кому-то еще в затруднительном положении.


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

0

Просто выполните команду update-migration -Script. Это создает новый сценарий * .sql, который включает все изменения БД, включенные в миграцию. В конце кода находятся команды вставки примерно такого вида: INSERT [dbo]. [__ MigrationHistory] ([MigrationId], [ContextKey], [Model], [ProductVersion]) вы можете просто запустить все это INSERT, и БД будет синхронизирована


0

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

В Visual Studio -> Инструменты -> SQL Server -> Сравнение новой схемы

Сначала я создал новую полностью новую базу данных с миграциями EF. Затем я провел сравнение, сравнив новую базу данных с той, которую я хотел обновить. Наконец, сгенерировал сценарий миграции, и я смог выполнить обновление схемы.


0

В моем случае (хочу сбросить и получить свежую базу данных),

Сначала я получил сообщение об ошибке: There is already an object named 'TABLENAME' in the database.

и немного раньше я видел:

"Applying migration '20111111111111_InitialCreate'.
Failed executing DbCommand (16ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE MYFIRSTTABLENAME"

Моя база данных была создана, но в истории миграций нет записи.

Я отбрасываю все таблицы, кроме dbo .__ MigrationsHistory

История миграции была пуста.

Бегать dotnet ef database update -c StudyContext --verbose

(--verbose просто для удовольствия)

и получил Done.


0

Я столкнулся с той же ошибкой, что и ниже. Затем я исправил это, как показано ниже:

  1. Проверьте текущие базы данных в вашем проекте:
    • dotnet ef migrations list
  2. Если вы добавили самое новое, удалите его:
    • dotnet ef migrations remove
  3. Гарантийные выходы этой базы данных должны быть обнаружены в исходном коде: файлы .cs / .Designer.cs

4.Теперь все в порядке. Попробуй еще раз добавить: dotnet ef migrations add [new_dbo_name]

5.Наконец, попробуйте обновить еще раз в соответствии со списком миграции:

  • dotnet ef database update [First]
  • dotnet ef database update [Second]
  • ...
  • dotnet ef database update [new_dbo_name]

Надеюсь, это поможет вам. ^^


0

Вы удалили папку миграции, чем пытаетесь запустить команду «update-database» в консоли диспетчера пакетов? если так

Просто вручную удалите все свои таблицы, чем запустите, если update-databse (данные cons-seed будут удалены)


0

Другой способ сделать это - прокомментировать все в начальном классе, между методами Up и Down. Затем запустите update-database, после того, как метод seed был успешным, поэтому снова запустите update-database. Это может быть полезно для некоторых друзей.


0

Я столкнулся с той же проблемой. Я попробовал следующее решение: 1. удалил код создания таблицы из Up () и связанный код из метода Down () 2. Запустите команду update-database в диспетчере пакетов Consol

это решило мою проблему


0

Примечание: я сделал это, потому что у меня ничего нет в моей базе данных. В моем случае: 1. Я удалил миграцию командой remove-migration в консоли диспетчера пакетов 2. Удалена база данных с помощью панели «Обозреватель объектов SQL Server»> в текущей базе данных> щелкните правой кнопкой мыши> Удалить 3. Перенесено в консоли диспетчера пакетов написать Добавить -Миграция и жмем Enter 4. Последнее обновление командой update-database


0

Тот же случай (без БД и таблицы MigrationHistory на сервере). Мои шаги:

  1. Я удалил данные миграции из раздела «Вверх» и «Вниз» своей первой миграции.
  2. Обновить базу данных с пустой миграцией (создана таблица MigrationHistory)
  3. Добавьте вашу НАСТОЯЩУЮ миграцию и обновите с ней базу данных.

0

В базе данных запросите таблицу __MigrationHistory и скопируйте [ContextKey].

Вставьте его в DbMigrationsConfiguration ConextKey, как показано ниже.

internal sealed class DbConfiguration: DbMigrationsConfiguration<DbContext>
    {
        public DbConfiguration()
        {
            AutomaticMigrationsEnabled = true;
            ContextKey = "<contextKey from above>";
        }

0

Следующие шаги помогли мне решить ту же проблему:

Сценарий:

Я пытался добавить 2 новых поля к моей существующей модели для работы с электронной почтой. Новые поля - «IsEmailVerified» и «ActivationCode».

Шаги, которые я сделал:

1. Удалены старые файлы миграции в папке «Migrations», которые не позволяют мне выполнить Update-Database 2. Отменить все мои недавние изменения, которые я сделал в модели.

3. Выполните следующую команду:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = **** "

4. удалил содержимое методов Up () и Down () из файла миграции и оставил методы пустыми.

5. Выполните следующую команду:

Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Источник данных = DESKTOP \ SQLEXPRESS; Начальный каталог = Пользовательский; Сохранение информации о безопасности = True; ID пользователя = sa; пароль = " ***

  1. После выполнения вышеуказанного шага модель и БД выглядят синхронизированными.

  2. Теперь я добавил новые свойства в модель.

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. Выполните следующую команду:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

  1. Теперь файл миграции содержит только мои последние изменения, как показано ниже:

       public override void Up()
         {
             AddColumn("dbo.UserAccounts", "IsEmailVerified", c => c.Boolean(nullable: false));
             AddColumn("dbo.UserAccounts", "ActivationCode", c => c.Guid(nullable: false));
         }        
         public override void Down()
         {
             DropColumn("dbo.UserAccounts", "ActivationCode");
             DropColumn("dbo.UserAccounts", "IsEmailVerified");
         }
  2. Выполните следующую команду: Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

11.Теперь я успешно обновил базу данных дополнительными столбцами.

Ниже представлена ​​обновленная таблица после последних изменений:

Таблица после миграции обновления


на самом деле не рекомендую это делать, удаление продукта при миграции просто разрушит вашу среду. зачем вам удалять свои миграции, если они до сих пор работали? и ваши строки подключения не будут работать для каждого пользователя здесь, не следует запускать их так
rakuens

-5

В файле миграции проверьте общедоступный метод переопределения void Up () . Возможно, вы пытаетесь создать новый объект db, который уже находится в базе данных. Итак, вам нужно удалить этот объект / таблицу перед созданием объекта db. Просто сделай как ниже-

DropTable("dbo.ABC"); 
CreateTable(
            "dbo.ABC",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    ..
                 }

А теперь запустите миграцию Update-Database -TargetMigration: "2016_YourMigration"


6
Если вы сделаете это, вы потеряете все свои данные,
Mehdiway
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.