Update-Database gagal dari Package Manager Console. Saya telah menggunakan Entity Framework 6.x dan pendekatan kode-pertama. Kesalahan adalah
"Sudah ada objek bernama 'AboutUs' di database."
Bagaimana saya bisa mengatasi masalah ini?
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 saya adalah:
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; }
}
Kelola Paket Konsol:
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
Kata Roohullah Allem
sumber
sumber
Jawaban:
sepertinya ada masalah dalam proses migrasi, jalankan perintah add-migrasi di "Package Manager Console":
lakukan beberapa perubahan, lalu perbarui database dari file "Awal":
Sunting: -IgnoreChanges ada di EF6 tapi tidak di EF Core, berikut solusinya: https://stackoverflow.com/a/43687656/495455
sumber
Mungkin Anda telah mengubah namespace dalam proyek Anda!
Ada tabel di basis data Anda yang disebut
dbo.__MigrationHistory
. Tabel tersebut memiliki kolom yang disebutContextKey
.Nilai kolom ini didasarkan pada Anda
namespace
. misalnya adalah "DataAccess.Migrations.Configuration
".Ketika Anda mengubah namespace, itu menyebabkan nama tabel duplikat dengan namespace berbeda.
Jadi, setelah Anda mengubah namespace di sisi kode, ubah juga namespace di tabel ini di database, (untuk semua baris).
Misalnya, jika Anda mengubah namespace menjadi
EFDataAccess
, maka Anda harus mengubah nilaiContextKey
kolomdbo.__MigrationHistory
menjadi "EFDataAccess.Migrations.Configuration
".Kemudian di sisi kode, di Tools => Package Manager Console, gunakan
update-database
perintah.Pilihan lain daripada mengubah nilai konteks dalam database adalah dengan kode keras nilai konteks dalam kode Anda ke nilai namespace lama. Hal ini dimungkinkan dengan mewarisi
DbMigrationsConfiguration<YourDbContext>
dan dalam konstruktor cukup tetapkan nilai konteks lama keContextKey
, daripada mewarisi dariMigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>
dan biarkan kelas itu kosong. Hal terakhir yang harus dilakukan adalah memanggilDatabase.SetInitializer(new YourDbInitializer());
DbContext Anda dalam konstruktor statis.Saya harap masalah Anda akan teratasi.
sumber
MigrationHistory
tabel tidak memperbaikinya untuk saya ... jadi saya menjatuhkan semua tabel saya dan membiarkan EF membuat semuanya lagi, aplikasi kecil, bukan masalah besar. ..tapi itu memperbaikinya untuk saya.Pengecualian ini memberi tahu Anda bahwa seseorang telah menambahkan objek bernama 'AboutUs' ke database.
AutomaticMigrationsEnabled = true;
dapat menyebabkannya karena versi basis data tidak dikontrol oleh Anda dalam kasus ini. Untuk menghindari migrasi yang tidak dapat diprediksi dan memastikan bahwa setiap pengembang di tim bekerja dengan struktur basis data yang sama yang saya sarankan untuk Anda tetapkanAutomaticMigrationsEnabled = false;
.Migrasi otomatis dan Migrasi berkode dapat hidup berdampingan jika Anda sangat berhati-hati dan satu-satunya pengembang dalam sebuah proyek.
Ada kutipan dari posting Migrasi Pertama Kode Otomatis di Pusat Pengembang Data :
sumber
Dalam kasus saya,
EFMigrationsHistory
meja saya dikosongkan (entah bagaimana) dan ketika mencoba menjalankanupdate-database
saya akan mendapatkan:Setelah melihat tabel telah dikosongkan, masuk akal jika mencoba menjalankan kembali migrasi awal dan mencoba membuat ulang tabel.
Untuk memperbaiki masalah ini saya menambahkan baris ke dalam
EFMigrationsHistory
tabel saya . 1 baris untuk setiap migrasi yang saya tahu bahwa database tersebut adalah yang terbaru.Sebuah baris akan memiliki 2 kolom:
MigrationId
danProductVersion
MigrationId
adalah nama file migrasi Anda. Contoh:20170628112345_Initial
ProductVersion
adalah versi ef yang Anda jalankan. Anda dapat menemukannya dengan mengetikGet-Package
di Package Manager Console dan mencari paket ef Anda.Semoga ini bermanfaat bagi seseorang.
sumber
Dalam kasus saya, saya telah menamai ulang rakitan yang berisi model kerangka kerja entitas kode pertama. Meskipun skema sebenarnya tidak berubah sama sekali, tabel migrasi dipanggil
berisi daftar migrasi yang telah dilakukan berdasarkan nama assembly yang lama . Saya memperbarui nama lama di tabel migrasi agar sesuai dengan yang baru dan migrasi kemudian berfungsi lagi.
sumber
Pastikan proyek startup solusi Anda memiliki connectionstring yang benar di file konfigurasi. Atau setel parameter -StartUpProjectName saat menjalankan perintah update-database. Parameter -StartUpProjectName menentukan file konfigurasi yang akan digunakan untuk string koneksi bernama. Jika dihilangkan, file konfigurasi proyek yang ditentukan akan digunakan.
Berikut ini tautan untuk referensi perintah migrasi-ef http://coding.abel.nu/2012/03/ef-migrations-command-reference/
sumber
Saya memiliki masalah yang sama dan setelah tiga jam berjuang saya mencari tahu apa yang terjadi
Dalam kasus saya, ketika saya ingin bermigrasi untuk pertama kalinya dalam
up()
metode, kode default ingin membuat tabel yang sudah ada jadi saya mendapat kesalahan yang sama dengan AndaUntuk mengatasinya, hapus saja kode tersebut dan tulis keinginan yang Anda inginkan. Misalnya, saya ingin menambahkan kolom jadi saya hanya menulis
sumber
@
mengirimi saya pesan, cukup ketik diikuti dengan nama pengguna saya di bagian komentar.Catatan: bukan solusi yang disarankan. tetapi perbaikan cepat dalam beberapa kasus.
Bagi saya,
dbo._MigrationHistory
dalam database produksi melewatkan catatan migrasi selama proses publikasi, tetapi database pengembangan memiliki semua catatan migrasi.Jika Anda yakin bahwa db produksi memiliki skema yang sama dan terbaru dibandingkan dengan db dev, menyalin semua catatan migrasi ke db produksi dapat menyelesaikan masalah.
Anda dapat melakukannya hanya dengan VisualStudio.
dbo._MigrationHistory
tabel di database source (dalam kasus saya dev db)> Klik menu "Data Comparison ...".Perhatikan bahwa, sekali lagi, ini tidak disarankan dalam proyek yang rumit dan serius. Gunakan ini hanya jika Anda mengalami masalah selama pembelajaran ASP.Net atau EntityFramework.
sumber
Hapus baris dari tabel dbo_MigrationHistory atau hapus tabel dan jalankan
Ini akan menjalankan semua migrasi dalam proyek Anda satu per satu
sumber
Dalam kasus saya, masalahnya ada di Seeder. Saya memanggil _ctx.Database.EnsureCreated () di dalamnya dan sejauh yang saya mengerti, perintah update database telah berhasil dijalankan, tetapi kemudian seeder mencoba membuat database "kedua" kali.
Bagaimana menangani:
sumber
Skenario EF Core edge-case lainnya.
Periksa apakah Anda memiliki file Migrations / YOURNAMEContextModelSnapshot.cs .
seperti yang dijelaskan di - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration
Jika Anda mencoba membuat ulang database secara manual dengan menghapus file migrasi.cs, berhati-hatilah karena file Migrations / * ContextModelSnapshot.cs Anda masih ada.
Tanpanya, migrasi Anda berikutnya tidak memiliki snapshot untuk membuat perbedaan yang diperlukan dan file migrasi baru Anda akan terlihat seperti mereka membuat ulang semuanya lagi dari awal, Anda kemudian akan mendapatkan kesalahan tabel yang ada seperti di atas.
sumber
Hal yang sama terjadi pada saya .. Masalahnya adalah sebenarnya saya menghapus tabel Database saya
MoviesCast
dan membuat tabel baru dan masalahnya adalah migrasi terakhir saya mencoba untuk menginduksi tabel yang dihapusMoviesCast
dalam database. Saya menyelesaikannya dengan hanya menghapus semua konten migrasi terakhir dan hanya menjalankan metode Up () & down ()lalu perbarui database dan cukup tambahkan migrasi baru
sumber
Saya memiliki masalah yang sama yang dijelaskan dalam jawaban yang diberikan Elnaz. Saya memiliki persyaratan untuk mengubah namespace dari datalayer selama refactoring proyek kami. Hal ini menyebabkan migrasi tidak melihat migrasi yang ada di database. Saya menemukan jawaban yang sangat bagus untuk masalah ini yang di blog James Chambers.
http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/
Saya hanya mengubah yang berikut di file konfigurasi Migrasi.
Semoga ini membantu orang lain dalam kesulitan.
sumber
Cukup jalankan perintah pembaruan-migrasi -Script. Ini menghasilkan skrip * .sql baru yang mencakup semua perubahan DB yang disertakan dalam migrasi. Di akhir kode terdapat perintah insert seperti ini: INSERT [dbo]. [__ MigrationHistory] ([MigrationId], [ContextKey], [Model], [ProductVersion]) Anda cukup menjalankan ini semua INSERT dan DB akan disinkronkan
sumber
Setelah lebih dari satu jam tidak mendapatkan hasil apa pun, saya mencoba pendekatan lain, tidak menggunakan migrasi tetapi saya melakukan perbandingan skema.
Dalam Visual Studio -> Alat -> SQL Server -> Perbandingan Skema Baru
Pertama saya membuat database baru dengan migrasi EF. Kemudian saya melakukan perbandingan, membandingkan database baru dengan yang ingin saya perbarui. Akhirnya membuat skrip migrasi, dan saya dapat melakukan pembaruan skema.
sumber
Dalam kasus saya (ingin mengatur ulang dan mendapatkan database baru),
Pertama saya mendapat pesan kesalahan:
There is already an object named 'TABLENAME' in the database.
dan saya melihat, sedikit sebelumnya:
Basis data saya telah dibuat, tetapi tidak ada catatan dalam riwayat migrasi.
Saya menghapus semua tabel kecuali dbo .__ MigrationsHistory
MigrationsHistory kosong.
Lari
dotnet ef database update -c StudyContext --verbose
(--verbose hanya untuk bersenang-senang)
dan mendapatkan
Done.
sumber
Saya menghadapi bug yang sama seperti di bawah ini. Lalu saya perbaiki seperti di bawah ini:
dotnet ef migrations list
dotnet ef migrations remove
4. Sekarang sudah baik. Coba tambahkan kembali:
dotnet ef migrations add [new_dbo_name]
5. Terakhir, coba perbarui lagi, dalam pengaturan berdasarkan daftar migrasi:
dotnet ef database update [First]
dotnet ef database update [Second]
dotnet ef database update [new_dbo_name]
Semoga bermanfaat untuk Anda. ^^
sumber
Anda telah menghapus folder migrasi daripada Anda mencoba menjalankan perintah "update-database" di konsol Package manager? jika begitu
Hapus saja secara manual semua tabel Anda Daripada menjalankan jika update-databse (kontra data seed akan dihapus)
sumber
Cara lain untuk melakukannya adalah dengan mengomentari semua yang ada di Initial Class, antara Metode Up dan Down. Kemudian jalankan update-database, setelah metode seed berhasil dijalankan jadi jalankan update-database lagi, mungkin membantu beberapa teman.
sumber
Saya menghadapi masalah yang sama. Saya mencoba solusi di bawah ini: 1. dihapus buat kode tabel dari Up () dan kode terkait dari metode Down () 2. Jalankan perintah update-database di Package Manager Consol
ini memecahkan masalah saya
sumber
Catatan: Saya melakukannya karena saya tidak memiliki apa pun di database saya. Dalam kasus saya: 1. Saya menghapus migrasi dengan perintah remove-migrasi di Package Manager Console 2. Database yang dihapus oleh panel 'SQL Server Object Explorer'> di database saat ini> klik kanan> Hapus 3. Dimigrasikan di Package Manager Console tulis Tambahkan -Migrasi dan klik Enter 4. Update terakhir dengan perintah update-database
sumber
Kasus yang sama (tidak ada tabel DB dan MigrationHistory di Server). Langkah saya:
sumber
Di database, kueri tabel __MigrationHistory dan salin [ContextKey].
Tempel ke DbMigrationsConfiguration ConextKey seperti di bawah ini
sumber
Langkah-langkah di bawah ini berhasil untuk saya untuk masalah yang sama:
Skenario:
Saya mencoba menambahkan 2 bidang baru ke model saya yang sudah ada untuk fungsi Email. Kolom baru adalah "IsEmailVerified" dan "ActivationCode"
Langkah-langkah yang saya ikuti:
1. Menghapus file migrasi lama di bawah folder "Migrasi" yang mencegah saya melakukan Update-Database 2. Menghapus semua perubahan terbaru yang saya lakukan pada model
3. Jalankan perintah di bawah ini:
Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Sumber Data = DESKTOP \ SQLEXPRESS; Katalog Awal = Kustom; Persist Security Info = True; User ID = sa; password = **** "
4. Menghapus konten dari metode Naik () dan Turun () dari file migrasi dan mengosongkan metode
5. Jalankan perintah di bawah ini:
Perbarui-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Sumber Data = DESKTOP \ SQLEXPRESS; Katalog Awal = Kustom; Persist Security Info = True; User ID = sa; password = " ***
Setelah menjalankan langkah di atas, model dan DB terlihat sinkron.
Sekarang, saya menambahkan properti baru dalam model
Jalankan perintah di bawah ini:
Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Sumber Data = DESKTOP \ SQLEXPRESS; Katalog Awal = Kustom; Persist Security Info = True; User ID = sa; password = " ***
Sekarang file migrasi hanya berisi perubahan terbaru saya seperti di bawah ini:
Jalankan perintah di bawah ini: Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Sumber Data = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***
11. Sekarang saya berhasil memperbarui database dengan kolom tambahan.
Di bawah ini adalah tabel yang diperbarui setelah perubahan terbaru:
Tabel setelah migrasi pembaruan
sumber
Dalam file migrasi, periksa metode public override void Up () . Mungkin Anda mencoba membuat objek db baru yang sudah ada di database. Jadi, Anda perlu melepaskan objek / tabel ini sebelum membuat objek db. Lakukan saja seperti di bawah-
Dan sekarang jalankan migrasi Anda
Update-Database -TargetMigration: "2016_YourMigration"
sumber