データベースに名前の付いたオブジェクトがすでに存在します


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> 

どのようにすればよいですか(既存のデザインにマッピング)?
Roohullah Allemによると2014

15
@HLGEM、「適切に設計されたデータベース」をEFを使用してオブジェクトモデルにマップできる場合、EFはそれを生成することもできます。DBの移行は、データベースの導入を容易にする強力なツールです。DBマイグレーションの使用を避けることはお勧めしません。それ以外の場合は、とにかくパッチスクリプトが必要です。DBの移行を正しく使用することをお勧めします。
Ilya Palkin 2014年

回答:


128

移行プロセスに問題があるようです。「Package Manager Console」でadd-migrationコマンドを実行してください:

Add-Migration Initial -IgnoreChanges

いくつかの変更を行ってから、「初期」ファイルからデータベースを更新します。

データベースの更新-詳細

編集: -IgnoreChangesはEF6にはありますが、EF Coreにはありません。回避策は次のとおりです:https : //stackoverflow.com/a/43687656/495455


8
これは正確に何をしますか?これにより、新しいモデルで古いモデルを上書きできますか?
Travis Tubbs 2016年

1
データベースでテーブルだけでなくビューも使用しているため、手動移行を使い始めました。自動マイグレーションを使用しようとしたのでミスを犯し、その結果、ビューからテーブルを作成しようとしました。このシナリオでは、ソリューションが機能しません。代わりに、常に手動の移行を使用する必要があります。そのため、これを行った後、ソース管理の変更を元に戻し、_Migrationsテーブルから "Initial"エントリを削除する必要がありました。
arame3333 2017

3
これにより、無限ループが発生します。「次の明示的な移行が保留されているため、明示的な移行を生成できません...」というエラーが発生するため、パッケージマネージャーコンソールではAdd-Migrationを実行できません。しかし、そのUpdate-Databaseを正常に実行できない場合は、いくつかのInitial -IgnoreChangesもあるので、どうすればよいですか?
East of Nowhere 2018年

6
Add-Migration:パラメーター名 'IgnoreChanges'と一致するパラメーターが見つかりません。
Tzvi Gregory Kaidanov

3
@TravisTubbsこれは、行った変更を無視し、移行テーブルに関して、モデルがデータベースと同期されていることを "偽装"します。2つを手動で同期する必要があります。私の場合、モデルに加えた変更を削除し、Add-Migrationを実行し、update-databaseを実行する前にup / downメソッドからコンテンツを削除しました。これにより、移行が中断する前の状態に戻りました。次に、変更を実際に再追加し、通常どおりに移行、データベースの更新を行いました-今回はすべて同期しました
David Refaeli

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
すごい、まさにこの問題がありました!
Olivier ROMAND 2016年

3
実際、これがこのエラーの本当の原因です。nameSpaceの違いのためにデータベースに適用されている移行を読み取れないため、EFはデータベースを作成しようとしています
UfukSURMEN

この回答に感謝し、Olivier ROMANDが言ったように、私を助けてくれました。まさにこの問題がありました!
エンリケA.ピネロノベロ2017

私はそれがこれに関連しているとは思いませんでしたが、どういうわけかMigrationHistoryテーブルのレコードを削除しても修正されませんでした...すべてのテーブルを削除して、EFにすべてのemをもう一度作成させました、小さなアプリ、大したことはありません。 ..しかし、それは私のためにそれを修正しました。
Niklas

これは詳細を含む正解です。また、フォルダ名のスペルを間違えるとこの問題が発生することもあります。
H35am

17

「データベースにはすでに「AboutUs」という名前のオブジェクトがあります。」

この例外は、誰かがすでに「AboutUs」という名前のオブジェクトをデータベースに追加したことを示しています。

AutomaticMigrationsEnabled = true;この場合、データベースのバージョンはユーザーによって制御されないため、この問題が発生する可能性があります。予期しない移行を回避し、チームのすべての開発者が同じデータベース構造で作業できるようにするために、設定することをお勧めしますAutomaticMigrationsEnabled = false;

自動移行とコード化された移行は、プロジェクトの開発者が非常に慎重で唯一の開発者である場合は、共存できます。

データデベロッパーセンターの自動コード最初の移行の投稿からの引用があります

自動移行を使用すると、プロジェクトに変更を加えるたびにコードファイルがなくても、Code First Migrationsを使用できます。すべての変更を自動的に適用できるわけではありません。たとえば、列の名前を変更するには、コードベースの移行を使用する必要があります。

チーム環境の推奨事項

自動移行とコードベースの移行を混在させることができますが、これはチーム開発シナリオでは推奨されません。ソース管理を使用する開発者チームの一部である場合は、純粋に自動の移行または純粋にコードベースの移行のいずれかを使用する必要があります。自動移行には制限があるため、チーム環境でコードベースの移行を使用することをお勧めします。


12

私の場合、私のEFMigrationsHistoryテーブルは(どういうわけか)空になり、実行しようとすると次のようupdate-databaseになります。

データベースにはすでに「AspNetUsers」という名前のオブジェクトがあります

テーブルが空になったのを確認した後、最初の移行を再実行してテーブルを再作成しようとしているのは理にかなっています。

この問題を解決するために、EFMigrationsHistoryテーブルに行を追加しました。データベースが最新であることを知っていた移行ごとに1行。

行2列を有することになる。MigrationIdそしてProductVersion

MigrationId移行ファイルの名前です。例:20170628112345_Initial

ProductVersion実行しているefバージョンです。これGet-Packageは、パッケージマネージャーコンソールに入力してefパッケージを探すことで確認できます。

これが誰かに役立つことを願っています。


1
モデル列にはどのようにデータを入力しましたか?
Ciaran Gallagher

7

私の場合、コードファーストエンティティフレームワークモデルを含むアセンブリの名前を変更しました。実際のスキーマは呼び出された移行テーブルでまったく変更されていませんが

dbo.__MigrationHistory

古いアセンブリ名に基づいて既に実行された移行のリストが含まれています。新しいものと一致するように移行テーブルの古い名前を更新したところ、移行は再び機能しました。


5

ソリューションのスタートアッププロジェクトの構成ファイルに正しい接続文字列があることを確認してください。または、update-databaseコマンドを実行するときに-StartUpProjectNameパラメーターを設定します。-StartUpProjectNameパラメーターは、名前付き接続文字列に使用する構成ファイルを指定します。省略した場合、指定したプロジェクトの構成ファイルが使用されます。

ここにef-migrationコマンドリファレンスのリンクがあります http://coding.abel.nu/2012/03/ef-migrations-command-reference/


この答えは私をミスに導きました、私は単にスタートアッププロジェクトとして間違ったプロジェクトを持っていました。
Martin Johansson

私は同様の問題を抱えていましたが、これで解決しました。
JordanTDN 2018年

3

私は同じ問題を抱えており、3時間の苦労の末、私は何が起こっているのかを知りました

私の場合、初めて移行したいとき up()メソッドで、デフォルトのコードはすでに存在するテーブルを作成したいので、あなたと同じエラーが発生しました

それを解決するには、それらのコードを削除して、あなたが望むように書いてください。たとえば、列を追加したかったので、

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

良い回答のように見えますが、スペルを確認することをお勧めします。コードスニペットを使用して、最後の行がコードであることを明確にすることもできます。これについてサポートが必要な場合は、メッセージを送ってください。
マイクプール

どうすればマッサージできますか
アルファ

1
コードスニペット@arfaを追加することはよくできました。マッサージは必要ありません:)。メッセージを送りたい場合@は、コメントセクションにユーザー名を入力してください。
マイクプール

3

注:推奨されるソリューションではありません。しかし、いくつかのケースでは迅速な修正。

私にとって、dbo._MigrationHistory運用データベースでは発行プロセス中に移行レコードを逃しましたが、開発データベースにはすべての移行レコードがありました。

本番データベースがdev dbと比較して同じで最新のスキーマを持っていることが確実な場合は、すべての移行レコードを本番データベースにコピーすると問題が解決する可能性があります。

VisualStudioだけで行うことができます。

  1. [SQL Serverオブジェクトエクスプローラー]パネルを開きdbo._MigrationHistory、ソース(私の場合はdev db)データベースのテーブルを右クリックして、[データ比較...]メニューをクリックします。
  2. 次に、データ比較ウィザードがポップアップ表示され、ターゲットデータベース(この場合は本番データベース)を選択して、[次へ]をクリックします。
  3. 数秒後、ソースデータベースにのみいくつかのレコードが表示されます。「Update Target」ボタンをクリックするだけです。
  4. ブラウザで、更新ボタンをクリックして、エラーメッセージが表示されないことを確認します。

繰り返しますが、複雑で深刻なプロジェクトでは推奨されません。これは、ASP.NetまたはEntityFrameworkの学習中に問題が発生した場合にのみ使用してください。


1
これでうまくいきました。しかし、それは逆でした。私のプロダクションデータベースは__EFMigrationHistoryにすべてのレコードがありましたが、開発データベースのレコードは何らかの理由で欠落しています(初期レコードを除く)。
Jens Mander

1

dbo_MigrationHistoryテーブルから行を削除するか、テーブルを削除して実行します

update-database -verbose

プロジェクト内のすべての移行を1つずつ実行します


1

私の場合、問題はシーダーにありました。その内部で_ctx.Database.EnsureCreated()を呼び出していましたが、私が理解している限り、データベース更新コマンドは正常に実行されましたが、シーダーがデータベースを「2回」作成しようとしました。

対処方法:

  1. ナットランアップデートを実行し、アプリケーションを起動して、EnsureCreated()を呼び出します。データベースが作成/更新されます
  2. シーダーをコメント化または削除します。

1

別のエッジケースEFコアシナリオ。

Migrations / YOURNAMEContextModelSnapshot.csがあることを確認しますファイルます。

詳細-https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration

migration.csファイルを削除してデータベースを手動で再作成しようとした場合は、Migrations / * ContextModelSnapshot.csファイルがまだ存在していることに注意してください。

これがないと、その後の移行には必要な違いを作成するためのスナップショットがなく、新しい移行ファイルはすべてを最初から再作成しているように見え、上記のように既存のテーブルエラーが発生します。


1

同じことが私にも起こりました。問題は、実際にデータベーステーブルMoviesCastを削除して新しいテーブルを作成したことと、最後の移行でMoviesCastデータベース内の削除されたテーブルを誘導しようとしたことでした。私は最後の移行のすべてのコンテンツを削除し、Up()&down()メソッドを実行するだけで解決しました

public override void Up()
{
}

public override void Down()
{
}

次に、データベースを更新して、新しい移行を追加します


1

Elnazの答えにも同じ問題がありました。プロジェクトのリファクタリング中にデータレイヤーの名前空間を変更する必要がありました。これにより、移行でデータベース内の既存の移行が表示されなくなりました。James Chambersがブログに書いたこの問題に対する優れた答えを見つけました。

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”;
}

これが他の誰かを助けてくれることを願っています。


名前空間の変更後も同様の状況でした。この修正を試みましたが、まだ機能しませんでした。データベーステーブルの名前空間を手動で変更したので、機能し始めました。
kosist

0

コマンドupdate-migration -Scriptを実行するだけです。これにより、移行に含まれるすべてのDB変更を含む新しい* .sqlスクリプトが生成されます。コードの終わりには、次のような挿入コマンドがあります。


0

1時間以上何も結果が得られなかった後、マイグレーションを使用せずに別のアプローチを試しましたが、スキーマ比較を行いました。

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 .__ MigrationsHistoryを除くすべてのテーブルを削除します

MigrationsHistoryは空でした。

走る 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(consシードデータは削除されます)の場合は、実行するよりも手動ですべてのテーブルを手動で削除します。


0

これを行う別の方法は、UpメソッドとDownメソッドの間の初期クラスのすべてをコメント化することです。次に、シードメソッドの実行が成功した後、update-databaseを実行して、もう一度update-databaseを実行します。


0

私は同じ問題に直面していました。以下の解決策を試しました:1. Up()メソッドからテーブルコードを削除し、Down()メソッドから関連コードを削除しました2.パッケージマネージャーコンソールでupdate-databaseコマンドを実行します

これは私の問題を解決しました


0

注:データベースに何もないので、これを行いました。私の場合:1.私は、コマンドにより、マイグレーションを削除削除、移動のパッケージマネージャコンソール で3移行さを削除>右クリック>現在のデータベース上>「SQL Serverのオブジェクトエクスプローラの」パネルで2削除。データベースをパッケージマネージャコンソールの書き込み追加-移行してEnterをクリックします。4. update-databaseコマンドによる最後の更新


0

同じケース(サーバーにDBおよびMigrationHistoryテーブルがない)。私のステップ:

  1. 最初の移行のUpおよびDownセクションから移行データを削除しました。
  2. 空の移行でデータベースを更新(MigrationHistoryテーブルが作成されました)
  3. REAL移行を追加し、それを使用してデータベースを更新します。

0

データベースで、__ MigrationHistoryテーブルをクエリし、[ContextKey]をコピーします。

以下のようにDbMigrationsConfiguration ConextKeyに貼り付けます

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

0

以下の手順は同じ問題のために私のために働きました:

シナリオ:

メール機能の既存のモデルに2つの新しいフィールドを追加しようとしました。新しいフィールドは「IsEmailVerified」と「ActivationCode」です。

私が従った手順:

1.「移行」フォルダーの下の古い移行ファイルを削除したため、データベースの更新ができなかった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 "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

  1. 上記のステップを実行した後、モデルとDBは同期しているように見えます。

  2. 今、私はモデルに新しいプロパティを追加しました

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. 以下のコマンドを実行します。

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

  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 "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

11.Now私は正常に追加の列でデータベースを更新しました。

以下は、最近の変更後に更新された表です。

更新移行後の表


-5

移行ファイルで、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"


6
これを行うと、すべてのデータが失われます
Mehdiway
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.