В базі даних вже є об’єкт, названий


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-migrating в "Console Package Manager":

Початкові зміни міграції -IgnoreChanges

внесіть деякі зміни, а потім оновіть базу даних з файлу "Початковий":

Update-Database -вербоза

Редагувати: -IgnoreChanges є в EF6, але не в EF Core, ось вирішення: https://stackoverflow.com/a/43687656/495455


8
Що саме це робить? Чи дозволяє це новій моделі просто перезаписати стару?
Travis Tubbs

1
Я почав використовувати ручні міграції, оскільки в своїй базі даних використовую представлення та таблицю. Я помилився, намагаючись використовувати автоматичні міграції, і в результаті намагався створити таблицю з подання. У цьому сценарії ваше рішення не працює, замість цього я завжди повинен використовувати ручні міграції. Тому після цього мені довелося скасувати зміни в контролі джерел і видалити запис "Початковий" з таблиці _Migrations.
arame3333

3
Це просто призводить мене до нескінченного циклу: консоль Package Manager не дозволить мені робити додавання міграції, оскільки це дає помилку "Неможливо генерувати явну міграцію, оскільки такі явні міграції очікують ...", а саме InitialCreate. Але якщо я не можу успішно запустити цю Update-Database UNTIL, то є і деякі Initial -IgnoreChanges, то що я повинен робити ??
Схід від нікуди

6
Додавання міграції: не можна знайти параметр, який відповідає назві параметра "IgnoreChanges".
Цві Григорій Кайданов

3
@TravisTubbs це ігнорує внесені вами зміни та "підробляє" синхронізацію вашої моделі з db, що стосується таблиці міграції. Ще потрібно вручну синхронізувати ці два; У моєму випадку я видалив зміни, внесені до моделі, зробив додавання міграції, видалив вміст із методів вгору / вниз до того, як здійснити оновлення бази даних - це повернуло мене до стану перед тим, як зламати міграцію. Тоді я фактично повторно додав зміни, зробив додавання міграції та оновлення бази даних, як завжди - цього разу все синхронізоване
Девід Рефаелі

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 намагається створити базу даних, оскільки не може прочитати, які міграції застосовуються до бази даних через різницю
nameSpace

Дякуючи цій відповіді, мені дуже допомогли, як сказав Олів'є РОМАНД, у мене було саме це питання!
Енріке А. Пінело Новело

Я не мав уявлення, що це пов’язано з цим, але якимось чином навіть видалення записів MigrationHistoryтаблиці не виправив це для мене ... тож я кинув усі свої таблиці і нехай EF створює все знов, невеликий додаток, не biggie. ..але це зафіксували для мене.
Ніклас

Це правильна відповідь з деталями, також добре зазначити, що іноді неправильне написання назви папки спричинить цю проблему.
H35am

17

"В базі даних вже є об'єкт з назвою" AboutUs "."

Цей виняток говорить про те, що хтось уже додав до бази даних об’єкт з назвою "AboutUs".

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

Автоматичні міграції та кодовані міграції можуть жити поряд, якщо ви дуже обережні та єдиний розробник проекту.

У центрі розробників даних є цитата з публікації автоматичного коду з першої міграції :

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

Рекомендація для командного середовища

Ви можете перемежувати автоматичні та кодовані міграції, але це не рекомендується в сценаріях розвитку команди. Якщо ви є частиною команди розробників, яка використовує керування джерелами, вам слід використовувати або лише автоматичні міграції, або міграції на основі коду. Враховуючи обмеження автоматичних міграцій, ми рекомендуємо використовувати міграції на основі коду в командному середовищі.


12

У моєму випадку мій EFMigrationsHistoryстіл (якось) випорожнився, і при спробі запуску update-databaseя отримав би:

В базі даних вже є об’єкт з назвою "AspNetUsers"

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

Щоб вирішити цю проблему, я додав рядки до своєї EFMigrationsHistoryтаблиці. 1 рядок для кожної міграції, про яку я знав, що база даних була оновлена.

Рядок матиме 2 стовпці: MigrationIdіProductVersion

MigrationId- це ім'я вашого міграційного файла. Приклад:20170628112345_Initial

ProductVersion- це версія, яку ви працюєте. Ви можете знайти це, ввівши Get-Packageв консоль диспетчера пакунків і шукаючи свій пакет ef.

Сподіваюся, це комусь корисно.


1
Як ви заповнили стовпець Model?
Ciaran Gallagher

7

У моєму випадку я перейменував збірку, яка містила модель фреймворку коду першої сутності. Хоча фактична схема взагалі не змінилася, названа таблиця міграцій

dbo.__MigrationHistory

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


5

Переконайтеся, що проект запуску ваших рішень має правильний шнур з'єднання у конфігураційному файлі. Або встановіть параметр -StartUpProjectName під час виконання команди update-database. Параметр -StartUpProjectName вказує файл конфігурації, який використовується для названих рядків з'єднання. Якщо цей пункт пропущено, використовується вказаний файл конфігурації проекту.

Ось посилання на посилання на команди команд ef-migracija http://coding.abel.nu/2012/03/ef-migrations-command-reference/


Ця відповідь призвела до моєї помилки, я просто мав неправильний проект як проект запуску.
Мартін Йохансон

У мене була подібна проблема, і це вирішило для мене.
JordanTDN

3

У мене була така ж проблема, і після тригодинної боротьби я з'ясовував, що відбувається

У моєму випадку, коли я вперше хотів переїхати до Росії up() метод, код за замовчуванням хоче створити таблиці, які вже існували, тому я отримав таку ж помилку, як і ти

Щоб вирішити це, просто видаліть цей код і напишіть, що хочете. Наприклад, я хотів додати стовпчик, щоб я просто писав

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

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

Спасибі Як я можу вас масажувати
арфа

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

3

Примітка: не рекомендується рішення. але швидко виправити в деяких випадках.

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

Якщо ви впевнені, що у виробничого db є однакова і найновіша схема порівняно з dev db, копіювання всіх записів міграції у db-виробництво може вирішити проблему.

Ви можете робити лише з VisualStudio виключно.

  1. Відкрийте панель "Провідник об'єктів SQL Server"> dbo._MigrationHistoryтаблицю правою кнопкою миші у вихідній базі даних (у моєму випадку dev db)> Клацніть меню "Порівняння даних ...".
  2. Потім з'явився майстер порівняння даних, виберіть цільову базу даних (у моєму випадку виробництво db) та натисніть кнопку Далі.
  3. Через кілька секунд він покаже деякі записи лише у вихідній базі даних. просто натисніть кнопку "Оновити ціль".
  4. У браузері натисніть кнопку оновлення та побачите повідомлення про помилку.

Зауважте, що, знову ж таки, це не рекомендується в складних і серйозних проектах. Використовуйте це лише у вас виникли проблеми під час навчання ASP.Net або EntityFramework.


1
Це працювало для мене. Хоча це було навпаки. У моєму виробничому db були всі записи в __EFMigrationHistory, в той час як у dev db, де якимось чином відсутній (за винятком початкового).
Йенс Мандер

1

Видаліть рядки з таблиці dbo_MigrationHistory або видаліть таблицю та запустіть

update-database -verbose

Він здійснюватиме всі міграції у вашому проекті по черзі


1

У моєму випадку проблема була в Seeder. Я закликав _ctx.Database.EnsureCreate () всередині нього, і наскільки я зрозумів, команда оновлення бази даних успішно виконана, але потім сеяльник намагався створити базу даних "другий" час.

Як звернутися:

  1. Зробіть оновлення програми, просто запустіть програму та зателефонуйте до EnsureCreate (). База даних буде створена / оновлена
  2. Прокоментуйте або видаліть сівалку.

1

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

Перевірте, чи є у вас файл Міграції / YOURNAMEContextModelSnapshot.cs .

як детально в - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration

Якщо ви спробували вручну заново створити базу даних, видаливши файли migra.cs, ​​будьте обережні, що файл Migrations / * ContextModelSnapshot.cs все ще існує.

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


1

те ж саме сталося і зі мною .. Проблема полягала в тому, що насправді я видалив свою таблицю Бази даних MoviesCastі створив нову таблицю. Проблема полягала в тому, що моя остання міграція намагалася викликати видалену таблицю MoviesCastв базі даних. Я вирішив це, просто видаливши весь вміст останньої міграції та просто запустив метод Вгору () та Вниз ()

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 .__ МіграціїІсторія

МіграціїІсторія була порожньою.

Біжи dotnet ef database update -c StudyContext --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 (мінусові дані будуть видалені)


0

Ще один спосіб зробити це - прокоментувати все в початковому класі, між методами вгору та вниз. Потім запустіть оновлення-базу даних, після запуску насіннєвого методу було успішним, тому знову запустіть оновлення-базу даних. Можливо, це допоможе деяким друзям.


0

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

це вирішило мою проблему


0

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


0

Той самий випадок (на сервері немає таблиці БД і MigrationHistory). Мої кроки:

  1. Дані міграції видалено з розділу "Вгору та вниз" під час моєї першої міграції.
  2. Оновити базу даних з порожньою міграцією (створена таблиця MigrationHistory)
  3. Додайте реальну міграцію та оновіть із нею базу даних.

0

У базі даних запитуйте __MigrationHistory table та скопіюйте [ContextKey].

Вставте його в DbMigrationsConfiguration ConextKey, як показано нижче

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

0

Нижче описані кроки працювали для мене з тієї ж проблеми:

Сценарій:

Я намагався додати 2 нові поля до своєї існуючої моделі для функціональності електронної пошти. Нові поля "IsEmailVerified" та "ActivationCode"

Кроки, які я дотримувався:

1.Вибрані старі файли міграції у папці "Міграції", які мені заважають робити Update-Database 2.Відновлено всі мої останні зміни, які я зробив у моделі

3.Запустіть команду нижче:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Джерело даних = DESKTOP \ SQLEXPRESS; Початковий каталог = Спеціальний; Зберігати інформацію про безпеку = True; Ідентифікатор користувача = sa; пароль = **** "

4.Вибрав вміст із методів вгору () та вниз () з файлу міграції та залишив методи порожніми

5.Запустіть команду нижче:

Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Джерело даних = DESKTOP \ SQLEXPRESS; Початковий каталог = Спеціальний; Зберігати інформацію про безпеку = True; Ідентифікатор користувача = sa; пароль = " ***

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

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

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. Запустіть команду нижче:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Джерело даних = DESKTOP \ SQLEXPRESS; Початковий каталог = Спеціальний; Персистентна інформація про безпеку = True; Ідентифікатор користувача = sa; пароль = " ***

  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 "Джерело даних = DESKTOP \ SQLEXPRESS; Початковий каталог = Спеціальний; Персистентна інформація про безпеку = True; Ідентифікатор користувача = sa; пароль = " ***

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
Якщо ви це зробите, ви втратите всі свої дані
Мехдівей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.