В базе данных уже есть объект с именем
Не удалось обновить базу данных из консоли диспетчера пакетов. Я использовал 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>
31 ответ
Кажется, есть проблема в процессе миграции, запустите команду add -igration в "Консоли диспетчера пакетов":
Начальная Add-Migration -IgnoreChanges
выполните некоторые изменения, а затем обновите базу данных из файла "Initial":
Update-Database -verbose
Изменить:-IgnoreChanges в EF6, но не в EF Core, вот обходной путь: /questions/1604688/komanda-update-database-ne-rabotaet-v-aspnet-core-entity-framework-6-poskolku-obekt-v-baze-dannyih-uzhe-suschestvuet/1604704#1604704
Возможно, вы изменили пространство имен в своем проекте!
В вашей базе данных есть таблица 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 в статическом конструкторе.
Я надеюсь, что ваша проблема будет исправлена.
"В базе данных уже есть объект с именем AboutUs".
Это исключение говорит вам, что кто-то уже добавил объект с именем AboutUs в базу данных.
AutomaticMigrationsEnabled = true;
может привести к этому, так как версии базы данных в этом случае не контролируются вами. Чтобы избежать непредсказуемых миграций и убедиться, что каждый разработчик в команде работает с одинаковой структурой базы данных, я предлагаю вам установитьAutomaticMigrationsEnabled = false;
,
Автоматические миграции и закодированные миграции могут жить вместе, если вы очень осторожны и являетесь единственным разработчиком в проекте.
Цитата из поста "Автоматическая кодовая первая миграция" в Центре разработки данных:
Автоматическая миграция позволяет использовать Code First Migrations без наличия файла кода в вашем проекте для каждого внесенного вами изменения. Не все изменения могут быть применены автоматически - например, переименование столбцов требует использования миграции на основе кода.
Рекомендация для командных сред
Вы можете перемежать автоматические и основанные на коде миграции, но это не рекомендуется в сценариях групповой разработки. Если вы являетесь частью команды разработчиков, которые используют систему контроля версий, вам следует использовать либо полностью автоматические миграции, либо миграции исключительно на основе кода. Учитывая ограничения автоматической миграции, мы рекомендуем использовать миграции на основе кода в командной среде.
В моем случае мой EFMigrationsHistory
стол опустел (как-то) и при попытке запустить update-database
Я бы получил:
В базе данных уже есть объект с именем "AspNetUsers"
После того, как таблица была очищена, стало понятно, что она пытается повторно выполнить первоначальную миграцию и пытается воссоздать таблицы.
Чтобы решить эту проблему, я добавил строки в свой EFMigrationsHistory
Таблица. 1 строка для каждой миграции, с которой я знал, что база данных была актуальной.
Ряд будет иметь 2 столбца: MigrationId
а также ProductVersion
MigrationId
это имя вашего файла миграции. Пример: 20170628112345_Initial
ProductVersion
это версия ef, которую вы используете. Вы можете найти это, набрав Get-Package
в Консоль диспетчера пакетов и ищем ваш пакет ef.
Надеюсь, что это полезно для кого-то.
В моем случае я переименовал сборку, которая содержала базовую модель сущности кода. Хотя фактическая схема не изменилась вообще, таблица миграции называется
dbo.__MigrationHistory
содержит список уже выполненных миграций на основе старого имени сборки. Я обновил старое имя в таблице миграции, чтобы оно соответствовало новому, и миграция снова сработала.
Убедитесь, что в вашем проекте запуска решений правильная строка подключения в файле конфигурации. Или задайте параметр -StartUpProjectName при выполнении команды update-database. Параметр -StartUpProjectName указывает файл конфигурации, используемый для именованных строк подключения. Если опущен, используется файл конфигурации указанного проекта.
Вот ссылка для ссылок на команды ef -igration http://coding.abel.nu/2012/03/ef-migrations-command-reference/
У меня была такая же проблема, и после трехчасовой борьбы я выясняю, что происходит
В моем случае, когда я хотел мигрировать в первый раз в up()
метод, код по умолчанию хочет создать таблицы, которые уже существуют, поэтому я получил ту же ошибку, что и вы
Чтобы решить эту проблему, просто удалите этот код и напишите, что хотите. Например, я хотел добавить столбец, поэтому я просто пишу
migrationBuilder.AddColumn<string>(
name: "fieldName",
table: "tableName",
nullable: true);
Примечание: не рекомендуемое решение. но быстро исправить в некоторых случаях.
Для меня, dbo._MigrationHistory
в производственной базе данных пропущены записи миграции во время процесса публикации, но в базе данных разработки были все записи миграции.
Если вы уверены, что производственная база данных имеет такую же и новейшую схему по сравнению с dev db, скопируйте все записи миграции в рабочую базу данных, чтобы решить эту проблему.
Вы можете сделать в VisualStudio исключительно.
- Откройте панель "SQL Server Object Explorer"> щелкните правой кнопкой мыши
dbo._MigrationHistory
таблица в исходной (в моем случае dev db) базе данных> Нажмите меню "Сравнение данных...". - Затем откроется мастер сравнения данных, выберите целевую базу данных (в моем случае - производственную базу данных) и нажмите кнопку "Далее".
- Через несколько секунд он покажет некоторые записи только в исходной базе данных. просто нажмите кнопку "Обновить цель".
- В браузере нажмите кнопку обновления и увидите, что сообщение об ошибке исчезло.
Обратите внимание, что, опять же, это не рекомендуется в сложном и серьезном проекте. Используйте это только у вас есть проблемы во время обучения ASP.Net или EntityFramework.
Удалите строки из таблицы dbo_MigrationHistory или удалите таблицу и запустите
update-database -verbose
Он будет запускать все миграции в вашем проекте один за другим.
В моём случае проблема была в сеидере. Я вызывал _ctx.Database.EnsureCreated() внутри него, и, насколько я понял, команда обновления базы данных успешно выполнена, но затем Сеидер попытался создать базу данных "второй раз".
Как обратиться:
- Запустите обновление, просто запустите приложение и вызовите EnsureCreated(). База данных будет создана / обновлена
- Закомментируйте или удалите сеялку.
Тот же случай (без БД и таблицы MigrationHistory на сервере). Мои шаги:
- Я удалил данные миграции из раздела "Вверх" и "Вниз" своей первой миграции.
- Обновить базу данных с пустой миграцией (создана таблица MigrationHistory)
- Добавьте вашу НАСТОЯЩУЮ миграцию и обновите с ней базу данных.
Еще один базовый сценарий EF Core.
Убедитесь, что у вас есть файл Migrations/YOURNAMEContextModelSnapshot.cs.
как подробно описано в - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/
Если вы попытались заново создать базу данных вручную, удалив файлы igration.cs, будьте осторожны, так как ваш файл Migrations/*ContextModelSnapshot.cs все еще существует.
Без этого у ваших последующих миграций не будет снимка, на котором можно создать необходимые различия, а ваши новые файлы миграции будут выглядеть так, как будто они воссоздают все заново, с нуля, и вы получите ошибку существующей таблицы, как описано выше.
То же самое случилось со мной.. Проблема была в том, что на самом деле я удалил свою таблицу базы данных MoviesCast
и создал новую таблицу, и проблема заключалась в том, что моя последняя миграция пыталась вызвать удаленную таблицу MoviesCast
в базе данных. Я решил это, просто удалив все содержимое последней миграции и просто запустив метод Up() и down()
public override void Up()
{
}
public override void Down()
{
}
затем обновите базу данных и просто добавьте новую миграцию
Вы удалили папку миграции, чем пытаетесь запустить команду "update-database" в консоли диспетчера пакетов? если так
Просто вручную удалите все свои таблицы, чем запустите, если update-databse(данные cons-seed будут удалены)
У меня была та же проблема, что и в ответе, который дал Эльназ. У меня было требование изменить пространство имен слоя данных во время рефакторинга нашего проекта. Это привело к тому, что миграции не увидели существующие миграции в базе данных. Я нашел отличный ответ на этот вопрос в блоге Джеймса Чемберса.
Я просто изменил следующее в файле конфигурации миграции.
public Configuration()
{
AutomaticMigrationsEnabled = false;
this.ContextKey = “Old_Namespace.Migrations.Configuration”;
}
Надеюсь, это поможет кому-то еще в затруднительном положении.
В базе данных запросите таблицу __MigrationHistory и скопируйте [ContextKey].
Вставьте его в DbMigrationsConfiguration ConextKey, как показано ниже.
internal sealed class DbConfiguration: DbMigrationsConfiguration<DbContext>
{
public DbConfiguration()
{
AutomaticMigrationsEnabled = true;
ContextKey = "<contextKey from above>";
}
Другой способ сделать это - прокомментировать все в начальном классе между методами Up и Down. Затем запустите update-database, после того, как запуск метода seed был успешным, поэтому снова запустите update-database. Это может быть полезно для некоторых друзей.
Просто выполните команду update-igration -Script. Это генерирует новый *.sql скрипт, который включает все изменения БД, включенные в миграцию. В конце кода команды вставки выглядят примерно так: INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion]), вы можете просто запустить все эти INSERT, и БД будет синхронизирована
Я столкнулся с той же проблемой. Я попробовал следующее решение: 1. удалил код создания таблицы из Up() и связанный код из метода Down() 2. Запустите команду update-database в диспетчере пакетов Consol
это решило мою проблему
Когда вы запускаете команду update-database, она проверяет записи таблицы __EFMigrationsHistory в базе данных с элементами папки EfMigration в вашем проекте. Поэтому, если у вас есть элемент миграции в папке проекта, которого нет в базе данных, ef core начнет применять эту миграцию в базе данных. , со временем вы можете столкнуться с такой ошибкой. Поэтому сравните элементы папки EfMigration с таблицей __EFMigrationsHistory в базе данных и убедитесь, что они оба синхронизированы и одинаковы вместе. Если в вашем проекте есть какой-либо элемент, которого нет в БД, добавьте его запись в базу данных, чтобы синхронизировать оба вместе (на самом деле это так). может привести к тому, что вы, вероятно, обрезаете свою таблицу __EFMigrationHistory в db)
Примечание: я сделал это, потому что у меня ничего нет в моей базе данных. В моем случае: 1. Я удалил миграцию командой remove-migration в консоли диспетчера пакетов 2. Удалена база данных с помощью панели "Обозреватель объектов SQL Server"> в текущей базе данных> щелкните правой кнопкой мыши> Удалить 3. Перенесено в консоли диспетчера пакетов написать Добавить -Миграция и жмем Enter 4. Последнее обновление командой update-database
У меня возникла та же проблема, когда я хотел добавить новую таблицу в существующую базу данных. Мой случай: сначала я создаю базу данных (DBShop) с помощью первого кода и создаю внутри нее одну таблицу (T_User). Затем, после того как я изменил свою модель и добавил еще две модели (Производство и Магазин), для создания таблиц внутри базы данных для этих двух новых моделей, я получил ошибку о том, что внутри базы данных T_User есть таблица. Чтобы решить эту проблему, после запуска Add-migration CreateDB -force перед обновлением базы данных я сослался на файл CreateDB.cs в папке иммиграции и удалил метод CreateTable, относящийся к таблице T_User, а затем запускаю update-database -verbose.
В моем случае (хочу сбросить и получить новую базу данных),
Сначала я получил сообщение об ошибке: 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
(- просто для удовольствия)
и получил Done.
Я столкнулся с той же ошибкой, что и ниже. Затем я исправил это, как показано ниже:
- Проверьте текущие базы данных в вашем проекте:
dotnet efmigrations list
- Если вы добавили самое новое, удалите его:
dotnet efmigrations remove
- Гарантийные выходы этой базы данных должны быть обнаружены в исходном коде: файлы.cs /.Designer.cs
4.Теперь все в порядке. Попробуй еще раз добавить:
dotnet efmigrations add [new_dbo_name]
5.Наконец, попробуйте обновить еще раз в соответствии со списком миграции:
dotnet ef database update [First]
dotnet ef database update [Second]
- ...
dotnet ef database update [new_dbo_name]
Надеюсь, это поможет вам. ^^
Моя проблема была чем-то вроде единичного/нечетного случая, возможно, но FWIW я также получал эту ошибку, и проблема возникла из-за того, что мой AppDbContext.cs имел метод OnConfiguring(), который указывал на другую базу данных (которая уже имела объект в нем). Использование -verbose помогло мне найти это.
Я удалил метод OnConfiguring, но затем моя база данных обновлений выдала другую ошибку. В конце концов я понял, что должен сохранить метод OnConfiguring в моем файле AppDbContext.cs и включить мою реальную строку подключения к базе данных. Это, конечно, избыточно, и я понимаю, что информация о пользователе/пароле в вашем коде устарела/не очень безопасна, но как только я внес эти изменения, моя база данных обновлений, наконец, заработала без ошибок. Мой связанный код ниже. Если у кого-то есть предложения о том, как решить эту проблему более чистым способом, пожалуйста, отзовитесь.
// my appdbcontext.css file
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("Server=myserver;Database=mydatabase;MultipleActiveResultSets=true;User ID=myuser;Password=mypass");
}
}
// my program.cs
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
После более часа отсутствия результатов я попробовал другой подход, не используя миграции, но я сравнил схему.
В Visual Studio -> Инструменты -> SQL Server -> Сравнение новой схемы
Сначала я создал новую совершенно новую базу данных с EF-миграциями. Затем я сравнил новую базу данных с той, которую хотел обновить. Наконец сгенерировал скрипт миграции, и я смог выполнить обновление схемы.
Столкнувшись с аналогичной проблемой, было обнаружено, что используемое соединение было из профиля публикации, хотя я изменил соединение в appsettings.json. Это привело к попытке миграции создать уже существующую таблицу. Внесение изменений в соединение в Connected Services проекта решило эту проблему.
Вы также можете отредактировать свой последний файл миграции ("201410101740197_AutomaticMigration.cs), чтобы очистить его код внутри функций Up(), down().
public override void Up()
{
}
public override void Down()
{
}
Есть некоторые проблемы, которые могут возникнуть, если код вашей модели БД (модель AboutUs) отличается от кода таблицы БД (больше полей...), тогда вам следует удалить его из кода модели или вы можете вручную обновить функцию Up/Down в иммиграционный файл, но сохраните разницу.
public override void Up()
{
// Keep difference from model with DB table here
}
public override void Down()
{
// Keep difference from model with DB table here
}
Следующие шаги помогли мне решить ту же проблему:
Сценарий:
Я пытался добавить 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; пароль = " ***
После выполнения вышеуказанного шага модель и БД выглядят синхронизированными.
Теперь я добавил новые свойства в модель
public bool IsEmailVerified { get; set; } public Guid ActivationCode { get; set; }
Выполните следующую команду:
Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source =DESKTOP\SQLEXPRESS; Initial Catalog = Custom; Persist Security Info =True; User ID = sa; password= " ***
Теперь файл миграции содержит только мои последние изменения, как показано ниже:
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"); }
Выполните следующую команду: Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source =DESKTOP\SQLEXPRESS; Initial Catalog = Custom; Persist Security Info =True; User ID = sa; password= " ***
11.Теперь я успешно обновил базу данных дополнительными столбцами.
Ниже представлена обновленная таблица после последних изменений:
Возможно, вы изменили пространство имен Configuration.cs. В вашей базе данных есть таблица с именемdbo.__MigrationHistory
. В таблице есть столбец с именемContextKey
.
new namespace AppData.Migrations { internal sealed class Configuration }
sql command
update [__MigrationHistory] set [ContextKey]= 'AppData.Migrations.Configuration'