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

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

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

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

internal sealed class Configuration : DbMigrationsConfiguration { public Configuration() { AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = false; } protected override void Seed(Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext context) { } } 

Мой DbContext:

 public class JahanBlogDbContext : IdentityDbContext { public JahanBlogDbContext() : base("name=JahanBlogDbConnectionString") { Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); modelBuilder.Entity().HasRequired(t => t.Article).WithMany(t => t.Comments).HasForeignKey(d => d.ArticleId).WillCascadeOnDelete(true); base.OnModelCreating(modelBuilder); modelBuilder.Entity().ToTable("User"); modelBuilder.Entity().ToTable("Role"); modelBuilder.Entity().ToTable("UserRole"); modelBuilder.Entity().ToTable("UserLogin"); modelBuilder.Entity().ToTable("UserClaim"); } public virtual DbSet
Articles { get; set; } public virtual DbSet ArticleLikes { get; set; } public virtual DbSet ArticleTags { get; set; } public virtual DbSet AttachmentFiles { get; set; } public virtual DbSet Comments { get; set; } public virtual DbSet CommentLikes { get; set; } public virtual DbSet CommentReplies { get; set; } public virtual DbSet ContactUs { get; set; } public virtual DbSet Projects { get; set; } public virtual DbSet ProjectStates { get; set; } public virtual DbSet ProjectTags { get; set; } public virtual DbSet Ratings { get; set; } public virtual DbSet Tags { get; set; } public virtual DbSet 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.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.b__2e() at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.c__DisplayClass1.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.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.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> 

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

Добавить-Миграция Initial -IgnoreChanges

внести некоторые изменения, а затем обновить базу данных из «Начального» файла:

Обновить-База данных -verbose

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 dbo.__MigrationHistory 

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

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

В базе уже есть объект с именем «AspNetUsers»

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

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

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

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

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

Надеюсь, это полезно для кого-то.

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

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

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

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

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

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

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

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

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

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

 update-database -verbose 

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

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

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

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

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

Давайте будем гением компьютера.