Подтвердить что ты не робот

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

Ошибка обновления базы данных из консоли диспетчера пакетов. Я использовал 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> 
4b9b3361

Ответ 1

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

Начальная версия надстройки -IgnoreChanges

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

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

Изменить: -IgnoreChanges находится в EF6, но не в EF Core, вот обходной путь: fooobar.com/questions/13639947/...

Ответ 2

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

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

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

Ответ 3

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

Это исключение говорит вам, что кто-то добавил базу данных уже "AboutUs" в базу данных.

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

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

В Центре разработчиков данных есть цитата из сообщения "Автоматический ввод кода первой миграции" :

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

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

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

Ответ 4

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

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

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

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

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

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

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

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

Ответ 5

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

dbo.__MigrationHistory

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

Ответ 6

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

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

Ответ 7

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

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

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

Вы можете делать только в VisualStudio.

  • Откройте панель "Проводник SQL Server" > щелкните правой кнопкой мыши таблицу dbo._MigrationHistory в базе данных источника (в моем случае dev db) > Нажмите "Сравнение данных...".
  • Затем запустится мастер сопоставления данных, выберите целевую базу данных (в моем случае для производства db) и нажмите "Далее".
  • Через несколько секунд он покажет некоторые записи только в исходной базе данных. просто нажмите кнопку "Обновить цель".
  • В браузере нажмите кнопку обновления и посмотрите сообщение об ошибке.

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

Ответ 8

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

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

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

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

Ответ 9

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

update-database -verbose

Он будет запускать все миграции в проекте по одному

Ответ 10

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

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

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

Ответ 11

Очередной сценарий EF Core.

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

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

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

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

Ответ 12

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

Ответ 13

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

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

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

Ответ 14

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

Сначала я получил сообщение об ошибке: 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.

Ответ 15

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

  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]

Надеюсь, это полезно для вас. ^^

Ответ 16

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

public override void Up()
{
}

public override void Down()
{
}

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

Ответ 17

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

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

Ответ 18

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

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

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