Sudah ada objek bernama dalam database


115

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> 

Bagaimana cara melakukannya (memetakan ke desain yang sudah ada)?
Kata Roohullah Allem

15
@HLGEM, Jika "database yang dirancang dengan baik" dapat dipetakan ke model objek menggunakan EF maka EF juga dapat menghasilkannya. Migrasi DB adalah alat yang ampuh yang membuat penerapan basis data Anda lebih mudah. Saya tidak akan merekomendasikan menghindari menggunakan migrasi DB. Jika tidak, skrip patch tetap dibutuhkan. Saya akan merekomendasikan untuk menggunakan migrasi DB dengan benar.
Ilya Palkin

Jawaban:


129

sepertinya ada masalah dalam proses migrasi, jalankan perintah add-migrasi di "Package Manager Console":

Tambahkan-Migrasi Awal -IgnoreChanges

lakukan beberapa perubahan, lalu perbarui database dari file "Awal":

Perbarui-Database -verbose

Sunting: -IgnoreChanges ada di EF6 tapi tidak di EF Core, berikut solusinya: https://stackoverflow.com/a/43687656/495455


8
Apa tepatnya yang dilakukan ini? Apakah ini memungkinkan model baru menimpa model lama?
Travis Tubbs

1
Saya mulai menggunakan migrasi manual karena saya menggunakan Tampilan serta Tabel di database saya. Saya membuat kesalahan dengan mencoba menggunakan migrasi otomatis dan sebagai hasilnya mencoba membuat tabel dari tampilan. Dalam skenario ini solusi Anda tidak berfungsi, saya harus selalu menggunakan migrasi manual. Jadi setelah melakukan ini, saya harus membatalkan perubahan dalam kontrol sumber dan menghapus entri "Awal" dari tabel _Migrations.
arame3333

3
Ini hanya membawa saya dalam loop tak terbatas: Package Manager Console tidak mengizinkan saya melakukan Add-Migration karena memberikan kesalahan "Tidak dapat menghasilkan migrasi eksplisit karena migrasi eksplisit berikut tertunda ..." yaitu InitialCreate. Tetapi jika saya tidak berhasil menjalankan Update-Database HINGGA ada juga beberapa Initial -IgnoreChanges, lalu apa yang harus saya lakukan ??
East of Nowhere

6
Add-Migration: Tidak dapat ditemukan parameter yang cocok dengan nama parameter 'IgnoreChanges'.
Tzvi Gregory Kaidanov

3
@TravisTubbs ini mengabaikan perubahan yang Anda buat dan "palsu" bahwa model Anda telah disinkronkan dengan db, berkaitan dengan tabel migrasi. Anda masih perlu menyinkronkan keduanya secara manual; Dalam kasus saya, saya menghapus perubahan yang dibuat pada model, melakukan Migrasi Tambah, menghapus konten dari metode naik / turun sebelum melakukan pembaruan-basis data - ini mengembalikan saya ke keadaan sebelum migrasi melanggar. Kemudian saya benar-benar menambahkan kembali perubahan, melakukan penambahan-migrasi, dan memperbarui-database seperti biasa - kali ini semuanya disinkronkan
David Refaeli

73

Mungkin Anda telah mengubah namespace dalam proyek Anda!
Ada tabel di basis data Anda yang disebut dbo.__MigrationHistory. Tabel tersebut memiliki kolom yang disebut ContextKey.
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 nilai ContextKeykolom dbo.__MigrationHistorymenjadi " EFDataAccess.Migrations.Configuration".
Kemudian di sisi kode, di Tools => Package Manager Console, gunakan update-databaseperintah.

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 ke ContextKey, daripada mewarisi dari MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>dan biarkan kelas itu kosong. Hal terakhir yang harus dilakukan adalah memanggil Database.SetInitializer(new YourDbInitializer());DbContext Anda dalam konstruktor statis.

Saya harap masalah Anda akan teratasi.


9
Luar biasa, kami benar-benar mengalami masalah ini!
Olivier ROMAND

3
Sebenarnya inilah penyebab sebenarnya dari kesalahan ini. EF mencoba membuat database karena EF tidak dapat membaca migrasi mana yang diterapkan ke database karena perbedaan
nameSpace

Terima kasih jawaban ini, banyak membantu saya, seperti yang dikatakan Olivier ROMAND, saya mengalami masalah ini!
Enrique A. Pinelo Novelo

saya tidak tahu itu terkait dengan ini, tetapi entah bagaimana menghapus catatan MigrationHistorytabel 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.
Niklas

Ini adalah jawaban yang benar dengan detail, juga bagus untuk menyebutkan bahwa terkadang salah mengeja nama folder akan menyebabkan masalah ini.
H35 pagi

17

"Sudah ada objek bernama 'AboutUs' di database."

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 :

Migrasi Otomatis memungkinkan Anda menggunakan Migrasi Pertama Kode tanpa memiliki file kode di proyek Anda untuk setiap perubahan yang Anda buat. Tidak semua perubahan dapat diterapkan secara otomatis - misalnya penggantian nama kolom memerlukan penggunaan migrasi berbasis kode.

Rekomendasi untuk Lingkungan Tim

Anda dapat menyelingi migrasi otomatis dan berbasis kode, tetapi ini tidak disarankan dalam skenario pengembangan tim. Jika Anda adalah bagian dari tim pengembang yang menggunakan kontrol sumber, Anda harus menggunakan migrasi otomatis murni atau migrasi berbasis kode murni. Mengingat keterbatasan migrasi otomatis, kami merekomendasikan penggunaan migrasi berbasis kode di lingkungan tim.


12

Dalam kasus saya, EFMigrationsHistorymeja saya dikosongkan (entah bagaimana) dan ketika mencoba menjalankan update-databasesaya akan mendapatkan:

Sudah ada objek bernama 'AspNetUsers' di database

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 EFMigrationsHistorytabel saya . 1 baris untuk setiap migrasi yang saya tahu bahwa database tersebut adalah yang terbaru.

Sebuah baris akan memiliki 2 kolom: MigrationIddanProductVersion

MigrationIdadalah nama file migrasi Anda. Contoh:20170628112345_Initial

ProductVersionadalah versi ef yang Anda jalankan. Anda dapat menemukannya dengan mengetik Get-Packagedi Package Manager Console dan mencari paket ef Anda.

Semoga ini bermanfaat bagi seseorang.


1
Bagaimana Anda mengisi kolom Model?
Ciaran Gallagher

7

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

dbo.__MigrationHistory

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.


5

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/


Jawaban ini membawa saya pada kesalahan saya, saya hanya memiliki proyek yang salah sebagai proyek Startup.
Martin Johansson

Saya mengalami masalah serupa dan ini memperbaikinya untuk saya.
JordanTDN

3

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 Anda

Untuk mengatasinya, hapus saja kode tersebut dan tulis keinginan yang Anda inginkan. Misalnya, saya ingin menambahkan kolom jadi saya hanya menulis

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

Sepertinya jawaban yang bagus tapi Anda mungkin ingin memeriksa ejaan Anda. Anda juga dapat menggunakan potongan kode untuk memperjelas bahwa baris terakhir adalah kode. Kirimi saya pesan jika Anda membutuhkan bantuan untuk ini.
Mike Poole

Terima kasih Bagaimana saya bisa memijat Anda
arfa

1
Bagus untuk menambahkan cuplikan kode @arfa. Tidak perlu dipijat :). Jika Anda ingin @mengirimi saya pesan, cukup ketik diikuti dengan nama pengguna saya di bagian komentar.
Mike Poole

3

Catatan: bukan solusi yang disarankan. tetapi perbaikan cepat dalam beberapa kasus.

Bagi saya, dbo._MigrationHistorydalam 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.

  1. Buka panel 'SQL Server Object Explorer'> klik kanan dbo._MigrationHistorytabel di database source (dalam kasus saya dev db)> Klik menu "Data Comparison ...".
  2. Kemudian, wizard Perbandingan Data muncul, pilih database target (dalam kasus saya produksi db) dan klik Berikutnya.
  3. Beberapa detik kemudian, ini akan menampilkan beberapa catatan hanya dalam database sumber. cukup klik tombol 'Perbarui Target'.
  4. Di browser, tekan tombol segarkan dan lihat pesan kesalahan hilang.

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.


1
Ini berhasil untuk saya. Namun, ternyata sebaliknya. Db produksi saya memiliki semua catatan di __EFMigrationHistory, sedangkan yang di dev db entah bagaimana hilang (kecuali yang pertama).
Jens Mander

1

Hapus baris dari tabel dbo_MigrationHistory atau hapus tabel dan jalankan

update-database -verbose

Ini akan menjalankan semua migrasi dalam proyek Anda satu per satu


1

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:

  1. Lakukan update nut run, cukup mulai aplikasi dan panggil EnsureCreated (). Database akan dibuat / diperbarui
  2. Beri komentar atau hapus seeder.

1

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.


1

Hal yang sama terjadi pada saya .. Masalahnya adalah sebenarnya saya menghapus tabel Database saya MoviesCastdan membuat tabel baru dan masalahnya adalah migrasi terakhir saya mencoba untuk menginduksi tabel yang dihapus MoviesCastdalam database. Saya menyelesaikannya dengan hanya menghapus semua konten migrasi terakhir dan hanya menjalankan metode Up () & down ()

public override void Up()
{
}

public override void Down()
{
}

lalu perbarui database dan cukup tambahkan migrasi baru


1

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.

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    this.ContextKey = Old_Namespace.Migrations.Configuration”;
}

Semoga ini membantu orang lain dalam kesulitan.


Saya memiliki situasi serupa setelah perubahan namespace. Sudah mencoba perbaikan ini, tetapi tetap tidak berhasil. Jadi saya telah memodifikasi namespace secara manual dalam tabel database, dan kemudian mulai berfungsi.
kosist

0

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


0

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.


0

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:

"Applying migration '20111111111111_InitialCreate'.
Failed executing DbCommand (16ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE MYFIRSTTABLENAME"

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.


0

Saya menghadapi bug yang sama seperti di bawah ini. Lalu saya perbaiki seperti di bawah ini:

  1. Periksa database saat ini dalam proyek Anda:
    • dotnet ef migrations list
  2. Jika yang terbaru adalah yang Anda tambahkan, hapuslah:
    • dotnet ef migrations remove
  3. Keluaran jaminan dari database ini harus dihapus dalam kode sumber: file .cs / .Designer.cs

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. ^^


0

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)


0

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.


0

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


0

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


0

Kasus yang sama (tidak ada tabel DB dan MigrationHistory di Server). Langkah saya:

  1. Saya menghapus data Migrasi dari bagian Atas dan Bawah pada migrasi pertama saya.
  2. Perbarui Database dengan migrasi kosong (tabel MigrationHistory telah dibuat)
  3. Tambahkan migrasi REAL Anda dan perbarui database dengannya.

0

Di database, kueri tabel __MigrationHistory dan salin [ContextKey].

Tempel ke DbMigrationsConfiguration ConextKey seperti di bawah ini

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

0

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 = " ***

  1. Setelah menjalankan langkah di atas, model dan DB terlihat sinkron.

  2. Sekarang, saya menambahkan properti baru dalam model

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  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 = " ***

  1. Sekarang file migrasi hanya berisi perubahan terbaru saya seperti di bawah ini:

       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. 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


benar-benar tidak menganjurkan hal ini, menghapus migrasi productin hanya akan merusak lingkungan Anda. mengapa Anda harus menghapus migrasi Anda jika mereka bekerja sejauh ini? dan string koneksi Anda tidak akan berfungsi untuk setiap pengguna di sini, tidak boleh menjalankannya seperti itu
rakuens

-5

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-

DropTable("dbo.ABC"); 
CreateTable(
            "dbo.ABC",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    ..
                 }

Dan sekarang jalankan migrasi Anda Update-Database -TargetMigration: "2016_YourMigration"


6
Jika Anda melakukan ini, Anda akan kehilangan semua data Anda
Mehdiway
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.