Ошибка обновления базы данных из консоли диспетчера пакетов. Я использовал 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>
database
entity-framework
ef-code-first
entity-framework-6
ef-migrations
Саид Рухулла Аллем
источник
источник
Ответы:
кажется, что в процессе миграции возникла проблема, запустите команду add-migration в «Консоли диспетчера пакетов»:
внесем некоторые изменения, а затем обновим базу данных из "Исходного" файла:
Изменить: -IgnoreChanges находится в EF6, но не в EF Core, вот обходной путь: https://stackoverflow.com/a/43687656/495455
источник
Возможно, вы изменили пространство имен в своем проекте!
В вашей базе данных есть таблица с названием
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 в статическом конструкторе.Надеюсь, ваша проблема будет исправлена.
источник
MigrationHistory
таблицы не помогло мне ... поэтому я отбросил все свои таблицы и позволил EF создать их все заново, небольшое приложение, без особого труда. ..но это исправило для меня.Это исключение сообщает вам, что кто-то уже добавил в базу данных объект с именем «AboutUs».
AutomaticMigrationsEnabled = true;
может привести к этому, поскольку версии базы данных в этом случае не контролируются вами. Чтобы избежать непредсказуемых миграций и убедиться, что каждый разработчик в команде работает с одной и той же структурой базы данных, я предлагаю вам установитьAutomaticMigrationsEnabled = false;
.Автоматические миграции и кодированные миграции могут существовать вместе, если вы очень осторожны и являетесь единственным разработчиком в проекте.
Цитата из сообщения Automatic Code First Migrations в Центре разработчиков данных :
источник
В моем случае моя
EFMigrationsHistory
таблица была опустошена (каким-то образом), и при попытке запуститьupdate-database
я получал:После того, как таблица была очищена, стало понятно, что она пытается повторно запустить начальную миграцию и пытается воссоздать таблицы.
Чтобы решить эту проблему, я добавил строки в свою
EFMigrationsHistory
таблицу. 1 строка для каждой миграции, которая, как я знал, обновлялась в базе данных.В строке будет 2 столбца:
MigrationId
иProductVersion
MigrationId
это имя вашего файла миграции. Пример:20170628112345_Initial
ProductVersion
это используемая вами версия ef. Вы можете найти его, набравGet-Package
в консоли диспетчера пакетов и найдя свой пакет ef.Надеюсь, это кому-то поможет.
источник
В моем случае я переименовал сборку, содержащую модель фреймворка сущностей с первым кодом. Хотя фактическая схема не изменилась, таблица миграций называется
содержит список уже выполненных миграций на основе имени старой сборки. Я обновил старое имя в таблице миграций, чтобы оно соответствовало новому, и затем миграция снова заработала.
источник
Убедитесь, что ваш проект запуска решений имеет правильную строку подключения в файле конфигурации. Или установите параметр -StartUpProjectName при выполнении команды update-database. Параметр -StartUpProjectName указывает файл конфигурации, используемый для именованных строк подключения. Если не указано, используется файл конфигурации указанного проекта.
Вот ссылка на ссылки на команды ef-migration http://coding.abel.nu/2012/03/ef-migrations-command-reference/
источник
У меня была такая же проблема, и после трех часов борьбы я узнал, что происходит
В моем случае, когда я впервые хотел выполнить миграцию в
up()
методе, код по умолчанию хочет создать таблицы, которые уже существуют, поэтому я получил ту же ошибку, что и выЧтобы решить эту проблему, просто удалите этот код и напишите, что хотите. Например, я хотел добавить столбец, поэтому просто напишу
источник
@
мое имя пользователя в разделе комментариев.Примечание: не рекомендуемое решение. но в некоторых случаях быстрое исправление.
Для меня
dbo._MigrationHistory
в производственной базе данных пропущены записи миграции во время процесса публикации, но в базе данных разработки были все записи миграции.Если вы уверены, что рабочая база данных имеет ту же самую новую схему по сравнению с dev db, копирование всех записей миграции в производственную базу данных может решить проблему.
Вы можете работать только с VisualStudio.
dbo._MigrationHistory
таблицу в исходной базе данных (в моем случае - dev db)> выберите меню «Сравнение данных ...».Учтите, что это опять же не рекомендуется в сложных и серьезных проектах. Используйте это только у вас есть проблемы во время обучения ASP.Net или EntityFramework.
источник
Удалите строки из таблицы dbo_MigrationHistory или удалите таблицу и запустите
Он запустит все миграции в вашем проекте одну за другой.
источник
В моем случае проблема была в Сидере. Я вызывал _ctx.Database.EnsureCreated () внутри него, и, насколько я понял, команда обновления базы данных успешно выполнилась, но затем сидер попытался создать базу данных «второй» раз.
Как обращаться:
источник
Еще один крайний сценарий EF Core.
Убедитесь, что у вас есть файл Migrations / YOURNAMEContextModelSnapshot.cs .
как подробно описано в - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration
Если вы пытались вручную воссоздать базу данных, удалив файлы migration.cs, убедитесь, что ваш файл Migrations / * ContextModelSnapshot.cs все еще существует.
Без этого у ваших последующих миграций нет моментального снимка, на котором можно было бы создать необходимые различия, и ваши новые файлы миграции будут выглядеть так, как будто они воссоздают все заново с нуля, тогда вы получите существующую ошибку таблицы, как указано выше.
источник
То же самое случилось со мной .. Проблема заключалась в том, что на самом деле я удалил свою таблицу базы данных
MoviesCast
и создал новую таблицу, и проблема заключалась в том, что моя последняя миграция пыталась вызвать удаленную таблицуMoviesCast
в базе данных. Я решил это, просто удалив все содержимое последней миграции и просто запустив метод Up () & down ()затем обновите базу данных и просто добавьте новую миграцию
источник
У меня была та же проблема, что и в ответе, который дал Эльназ. У меня было требование изменить пространство имен слоя данных во время рефакторинга нашего проекта. Это привело к тому, что миграции не увидели существующие миграции в базе данных. Я нашел отличный ответ на этот вопрос в блоге Джеймса Чемберса.
http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/
Я просто изменил следующее в файле конфигурации миграции.
Надеюсь, это поможет кому-то еще в затруднительном положении.
источник
Просто выполните команду update-migration -Script. Это создает новый сценарий * .sql, который включает все изменения БД, включенные в миграцию. В конце кода находятся команды вставки примерно такого вида: INSERT [dbo]. [__ MigrationHistory] ([MigrationId], [ContextKey], [Model], [ProductVersion]) вы можете просто запустить все это INSERT, и БД будет синхронизирована
источник
После более чем часа отсутствия результатов я попробовал другой подход, не используя миграции, но сравнил схемы.
В Visual Studio -> Инструменты -> SQL Server -> Сравнение новой схемы
Сначала я создал новую полностью новую базу данных с миграциями EF. Затем я провел сравнение, сравнив новую базу данных с той, которую я хотел обновить. Наконец, сгенерировал сценарий миграции, и я смог выполнить обновление схемы.
источник
В моем случае (хочу сбросить и получить свежую базу данных),
Сначала я получил сообщение об ошибке:
There is already an object named 'TABLENAME' in the database.
и немного раньше я видел:
Моя база данных была создана, но в истории миграций нет записи.
Я отбрасываю все таблицы, кроме dbo .__ MigrationsHistory
История миграции была пуста.
Бегать
dotnet ef database update -c StudyContext --verbose
(--verbose просто для удовольствия)
и получил
Done.
источник
Я столкнулся с той же ошибкой, что и ниже. Затем я исправил это, как показано ниже:
dotnet ef migrations list
dotnet ef migrations remove
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]
Надеюсь, это поможет вам. ^^
источник
Вы удалили папку миграции, чем пытаетесь запустить команду «update-database» в консоли диспетчера пакетов? если так
Просто вручную удалите все свои таблицы, чем запустите, если update-databse (данные cons-seed будут удалены)
источник
Другой способ сделать это - прокомментировать все в начальном классе, между методами Up и Down. Затем запустите update-database, после того, как метод seed был успешным, поэтому снова запустите update-database. Это может быть полезно для некоторых друзей.
источник
Я столкнулся с той же проблемой. Я попробовал следующее решение: 1. удалил код создания таблицы из Up () и связанный код из метода Down () 2. Запустите команду update-database в диспетчере пакетов Consol
это решило мою проблему
источник
Примечание: я сделал это, потому что у меня ничего нет в моей базе данных. В моем случае: 1. Я удалил миграцию командой remove-migration в консоли диспетчера пакетов 2. Удалена база данных с помощью панели «Обозреватель объектов SQL Server»> в текущей базе данных> щелкните правой кнопкой мыши> Удалить 3. Перенесено в консоли диспетчера пакетов написать Добавить -Миграция и жмем Enter 4. Последнее обновление командой update-database
источник
Тот же случай (без БД и таблицы MigrationHistory на сервере). Мои шаги:
источник
В базе данных запросите таблицу __MigrationHistory и скопируйте [ContextKey].
Вставьте его в DbMigrationsConfiguration ConextKey, как показано ниже.
источник
Следующие шаги помогли мне решить ту же проблему:
Сценарий:
Я пытался добавить 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; пароль = " ***
После выполнения вышеуказанного шага модель и БД выглядят синхронизированными.
Теперь я добавил новые свойства в модель.
Выполните следующую команду:
Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***
Теперь файл миграции содержит только мои последние изменения, как показано ниже:
Выполните следующую команду: Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***
11.Теперь я успешно обновил базу данных дополнительными столбцами.
Ниже представлена обновленная таблица после последних изменений:
Таблица после миграции обновления
источник
В файле миграции проверьте общедоступный метод переопределения void Up () . Возможно, вы пытаетесь создать новый объект db, который уже находится в базе данных. Итак, вам нужно удалить этот объект / таблицу перед созданием объекта db. Просто сделай как ниже-
А теперь запустите миграцию
Update-Database -TargetMigration: "2016_YourMigration"
источник