Veritabanında zaten adlandırılmış bir nesne var


115

Güncelleme-Veritabanı, Paket Yöneticisi Konsolundan başarısız oldu. Entity Framework 6.x ve kod ilk yaklaşımını kullandım. Hata

"Veritabanında zaten 'AboutUs' adlı bir nesne var."

Bu sorunu nasıl çözebilirim?

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'im:

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

Paket Yönetme Konsolu:

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> 

Bunu nasıl yapabilirim (mevcut tasarımla eşleştirme)?
Roohullah Allem

15
@HLGEM, Eğer "iyi tasarlanmış veritabanı" EF kullanılarak bir nesne modeline eşlenebilirse, EF de onu üretebilir. DB geçişleri, veri tabanınızın dağıtımını kolaylaştıran güçlü bir araçtır. DB geçişlerini kullanmaktan kaçınmanızı tavsiye etmem. Aksi takdirde yine de yama komut dosyalarına ihtiyaç vardır. DB geçişlerini doğru kullanmanızı tavsiye ederim.
Ilya Palkin

Yanıtlar:


129

geçiş sürecinde bir sorun var gibi görünüyor, "Paket Yöneticisi Konsolu" nda add-migration komutunu çalıştırın:

Add-Migration Initial -IgnoreChanges

bazı değişiklikler yapın ve ardından veritabanını "İlk" dosyadan güncelleyin:

Update-Database -verbose

Düzenleme: -IgnoreChanges EF6'da ancak EF Core'da değil, işte bir geçici çözüm: https://stackoverflow.com/a/43687656/495455


8
Bu tam olarak ne yapıyor? Bu, yeni modelin eskisinin üzerine yazmasına izin veriyor mu?
Travis Tubbs

1
Veritabanımda Görünümler ve Tablolar kullandığım için manuel geçişleri kullanmaya başladım. Otomatik geçişleri kullanmaya çalışma hatasını yaptım ve sonuç olarak bir görünümden tablo oluşturmaya çalışıyordu. Bu senaryoda çözümünüz çalışmıyor, bunun yerine her zaman el ile geçişleri kullanmalıyım. Bunu yaptıktan sonra kaynak kontrolündeki değişiklikleri geri almak ve _Migrations tablosundan "İlk" girişi kaldırmak zorunda kaldım.
arame3333

3
Bu beni sonsuz bir döngüye götürüyor: Paket Yöneticisi Konsolu Ekleme Taşıma yapmama izin vermiyor çünkü "Aşağıdaki açık geçişler beklemede olduğundan açık bir geçiş oluşturulamıyor ..." hatası veriyor, yani InitialCreate. Ancak bu Güncelleme Veritabanını BAŞARILI OLANA KADAR başarılı bir şekilde çalıştıramazsam, bazı İlk -IgnoreChanges da vardır, o zaman ne yapmam gerekiyor?
East of Nowhere

6
Add-Migration: 'IgnoreChanges' parametre adıyla eşleşen bir parametre bulunamıyor.
Tzvi Gregory Kaidanov

3
@TravisTubbs bu, yaptığınız değişiklikleri yok sayar ve modelinizin taşıma tablosuyla ilgili olarak db ile senkronize edildiğini "sahte" yapar. Yine de ikisini manuel olarak senkronize etmeniz gerekiyor; Benim durumumda, modelde yapılan değişiklikleri kaldırdım, bir Add-Migration yaptım, güncelleme-veri tabanını yapmadan önce içeriği yukarı / aşağı yöntemlerinden kaldırdım - bu beni geçişin kesilmesinden önceki duruma döndürdü. Sonra değişiklikleri yeniden ekledim, ekleme-taşıma ve her zamanki gibi veri tabanını güncelleme - bu sefer her şey senkronize edildi
David Refaeli

73

Belki projenizdeki ad alanını değiştirmişsinizdir!
Veri tabanınızda adlı bir tablo var dbo.__MigrationHistory. Tabloda adlı bir sütun vardır ContextKey.
Bu sütunun değeri, sizin namespace. örneğin " DataAccess.Migrations.Configuration" dir.
Ad alanını değiştirdiğinizde, farklı ad alanlarına sahip yinelenen tablo adlarına neden olur.
Bu nedenle, kod tarafında ad alanını değiştirdikten sonra, veritabanındaki bu tablodaki ad alanını da değiştirin (tüm satırlar için).
Örneğin, ad alanını olarak EFDataAccessdeğiştirirseniz, ContextKeysütunun değerlerini dbo.__MigrationHistory" EFDataAccess.Migrations.Configuration" olarak değiştirmelisiniz.
Ardından kod tarafında, Araçlar => Paket Yöneticisi Konsolu'nda update-databasekomutu kullanın.

Veritabanındaki bağlam değerini değiştirmek yerine başka bir seçenek, kodunuzdaki bağlam değerini eski ad alanı değerine sabit kodlamaktır. Bu, kalıtım yoluyla DbMigrationsConfiguration<YourDbContext>ve yapıcıda, eski bağlam değerini ContextKeydevralmaktan MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>ve bu sınıfı boş bırakmaktan ziyade ona atayarak mümkündür . Database.SetInitializer(new YourDbInitializer());Yapılması gereken son şey , DbContext'inizi statik bir kurucuda çağırmaktır .

Umarım sorunun çözülür.


9
Harika, tam olarak bu sorunu yaşadık!
Olivier ROMAND

3
Aslında bu hatanın gerçek nedeni budur. EF veri tabanı oluşturmaya çalışıyor, çünkü isim alanı farkı nedeniyle veritabanına hangi geçişlerin uygulandığını okuyamıyor
UfukSURMEN

Teşekkürler bu cevap, bana çok yardımcı oldu, Olivier ROMAND'in dediği gibi, tam olarak bu sorunu yaşadım!
Enrique A. Pinelo Novelo

bununla ilgili olduğu hakkında hiçbir fikrim yoktu, ancak bir şekilde MigrationHistorytablonun kayıtlarını kaldırmak bile benim için düzeltmedi ... bu yüzden tüm tablolarımı bıraktım ve EF'in hepsini yeniden oluşturmasına izin verdim, küçük uygulama, önemli değil. ..ama benim için düzeltti.
Niklas

Bu, ayrıntılarla birlikte doğru cevaptır, ayrıca bazen klasör adının yanlış yazılmasının bu soruna neden olacağını belirtmekte fayda var.
H35am

17

"Veritabanında zaten 'AboutUs' adlı bir nesne var."

Bu istisna, birisinin veritabanına zaten 'AboutUs' adlı bir nesne eklediğini söyler.

AutomaticMigrationsEnabled = true;bu durumda veri tabanı sürümleri sizin tarafınızdan kontrol edilmediği için buna yol açabilir. Öngörülemeyen geçişleri önlemek ve ekipteki her geliştiricinin aynı veri tabanı yapısı ile çalışmasını sağlamak için ayarlamanızı öneririmAutomaticMigrationsEnabled = false; .

Otomatik geçişler ve Kodlu geçişler, çok dikkatli olmanız ve bir projedeki tek geliştiricinin yanında yaşayabilir.

Veri Geliştirici Merkezi'ndeki Otomatik Kod İlk Taşıma gönderisinden bir alıntı var :

Otomatik Geçişler, yaptığınız her değişiklik için projenizde bir kod dosyası olmadan Code First Migrations kullanmanıza olanak tanır. Tüm değişiklikler otomatik olarak uygulanamaz - örneğin, sütun yeniden adları, kod tabanlı bir geçişin kullanılmasını gerektirir.

Takım Ortamları için Öneri

Otomatik ve kod tabanlı geçişler arasında serpiştirebilirsiniz ancak bu, ekip geliştirme senaryolarında önerilmez. Kaynak denetimi kullanan bir geliştirici ekibinin parçasıysanız, ya tamamen otomatik geçişleri ya da tamamen kod tabanlı geçişleri kullanmalısınız. Otomatik geçişlerin sınırlamaları göz önüne alındığında, ekip ortamlarında kod tabanlı geçişleri kullanmanızı öneririz.


12

Benim durumumda, EFMigrationsHistorymasam (bir şekilde) boşaltıldı ve koşmaya çalışırken şunu update-databasealıyordum:

Veritabanında zaten 'AspNetUsers' adında bir nesne var

Tablonun boşaltıldığını gördükten sonra, ilk geçişi yeniden başlatmaya ve tabloları yeniden oluşturmaya çalıştığı anlaşıldı.

Bu sorunu çözmek için tabloma satırlar ekledim EFMigrationsHistory. Veritabanının güncel olduğunu bildiğim her taşıma için 1 satır.

Bir satırda 2 sütun olur: MigrationIdveProductVersion

MigrationIdtaşıma dosyanızın adıdır. Misal:20170628112345_Initial

ProductVersionçalıştırdığınız ef sürümüdür. Bunu Get-Package, Paket Yöneticisi Konsoluna yazıp ef paketinizi arayarak bulabilirsiniz.

Umarım bu birisi için yararlıdır.


1
Model sütununu nasıl doldurdunuz?
Ciaran Gallagher

7

Benim durumumda, kod ilk varlık çerçeve modelini içeren derlemeyi yeniden adlandırdım. Asıl şema çağrılan geçiş tablosunun hiçbirinde değişmemiş olsa da

dbo.__MigrationHistory

eski derleme adına göre zaten gerçekleştirilmiş geçişlerin bir listesini içerir . Taşıma tablosundaki eski adı yenisiyle eşleşecek şekilde güncelledim ve taşıma işlemi tekrar çalıştı.


5

Çözüm başlangıç ​​projenizin yapılandırma dosyasında doğru bağlantı dizesine sahip olduğundan emin olun. Veya update-database komutunu çalıştırırken -StartUpProjectName parametresini ayarlayın. -StartUpProjectName parametresi, adlandırılmış bağlantı dizeleri için kullanılacak yapılandırma dosyasını belirtir. Atlanırsa, belirtilen projenin yapılandırma dosyası kullanılır.

İşte ef-migration komut referansları için bir bağlantı http://coding.abel.nu/2012/03/ef-migrations-command-reference/


Bu cevap beni hatama götürdü, Başlangıç ​​projesi olarak yanlış bir projeye sahip oldum.
Martin Johansson

Benzer bir sorun yaşıyordum ve bu benim için sorunu çözdü.
JordanTDN

3

Aynı problemi yaşadım ve üç saat uğraştıktan sonra neler olduğunu anladım

Benim durumumda, up()yöntemde ilk kez geçiş yapmak istediğimde, varsayılan kod zaten var olan tabloları oluşturmak istiyor, bu yüzden sizinle aynı hatayı alıyorum

Çözmek için bu kodu silin ve istediğinizi yazın. Örneğin, bir sütun eklemek istedim, bu yüzden sadece yazıyorum

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

İyi bir cevap gibi görünüyor ama yazımınızı kontrol etmek isteyebilirsiniz. Son satırın kod olduğunu netleştirmek için kod parçacıkları da kullanabilirsiniz. Bu konuda yardım istiyorsan bana mesaj at.
Mike Poole

Teşekkürler Sana nasıl masaj yapabilirim
arfa

1
@Arfa kod parçacığını eklediğiniz için tebrikler. Masaj yapmaya gerek yok :). Bana mesaj göndermek isterseniz @, yorum bölümüne kullanıcı adımı yazmanız yeterlidir.
Mike Poole

3

Not: tavsiye edilmeyen çözüm. ancak bazı durumlarda hızlı düzeltme.

Benim için, dbo._MigrationHistoryüretim veritabanında yayınlama sürecinde geçiş kayıtlarını kaçırdı, ancak geliştirme veritabanının tüm taşıma kayıtları vardı.

Üretim veritabanının dev db ile karşılaştırıldığında aynı ve en yeni şemaya sahip olduğundan eminseniz, tüm geçiş kayıtlarını üretim veritabanına kopyalamak sorunu çözebilir.

Yalnızca VisualStudio ile yapabilirsiniz.

  1. 'SQL Server Nesne Gezgini' panelini açın> dbo._MigrationHistorykaynak (benim durumumda dev db) veritabanındaki tabloyu sağ tıklayın > "Veri Karşılaştırma ..." menüsünü tıklayın.
  2. Ardından, Veri Karşılaştırma sihirbazı açılır, hedef veritabanını seçin (benim durumumda üretim db) ve İleri'ye tıklayın.
  3. Birkaç saniye sonra, bazı kayıtları yalnızca kaynak veritabanında gösterecektir. "Hedefi Güncelle" düğmesini tıklamanız yeterlidir.
  4. Tarayıcıda yenile düğmesine basın ve hata mesajının gittiğini görün.

Yine, karmaşık ve ciddi projelerde tavsiye edilmediğini unutmayın. Bunu yalnızca ASP.Net veya EntityFramework öğrenimi sırasında sorun yaşıyorsanız kullanın.


1
Bu benim için çalıştı. Yine de tam tersi oldu. Üretim veritabanım __EFMigrationHistory'deki tüm kayıtlara sahipken, dev db'deki kayıtlar bir şekilde eksikti (ilk kayıt hariç).
Jens Mander

1

Dbo_MigrationHistory tablosundaki satırları silin veya tabloyu silin ve çalıştırın

update-database -verbose

Projenizdeki tüm geçişleri tek tek çalıştıracak


1

Benim durumumda sorun Seeder'daydı. İçinde _ctx.Database.EnsureCreated () 'i çağırıyordum ve anladığım kadarıyla, veritabanı güncelleme komutu başarıyla yürütüldü, ancak daha sonra seeder veritabanını "ikinci" kez oluşturmaya çalıştı.

Nasıl adreslenir:

  1. Güncellemeyi çalıştırın, sadece uygulamayı başlatın ve EnsureCreated () 'i çağırın. Veritabanı oluşturulacak / güncellenecek
  2. Ekme makinesini yorumlayın veya kaldırın.

1

Başka bir uç durum EF Core senaryosu.

Bir Migrations / YOURNAMEContextModelSnapshot.cs dosyanız olup olmadığını kontrol edin.

ayrıntılı olarak - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration

Migration.cs dosyalarını silerek veritabanınızı manuel olarak yeniden oluşturmayı denediyseniz, Migrations / * ContextModelSnapshot.cs dosyanızın hala var olmasına dikkat edin.

Bu olmadan, sonraki geçişlerinizin üzerinde gerekli farklılıkları oluşturacak bir anlık görüntüsü olmaz ve yeni geçiş dosyalarınız her şeyi sıfırdan yeniden oluşturuyormuş gibi görünür, ardından yukarıdaki gibi mevcut tablo hatasını alırsınız.


1

aynısı bende de oldu .. Sorun şu ki Veritabanı tablomu sildim MoviesCastve yeni tablo yaptım ve sorun, son geçişimin MoviesCastveritabanında silinen tabloyu tetiklemeye çalışıyor olmasıydı . Son geçişin tüm içeriğini kaldırarak çözdüm ve basitçe Up () & down () yöntemini çalıştırdım

public override void Up()
{
}

public override void Down()
{
}

daha sonra veritabanını güncelledi ve sadece yeni taşıma ekleyin


1

Elnaz'ın verdiği cevapta da aynı sorunu anlattım. Projemizin yeniden düzenlenmesi sırasında veri katmanının ad alanını değiştirme zorunluluğum vardı. Bu, geçişlerin veritabanındaki mevcut geçişleri görmemesine neden oldu. James Chambers'ın blog yazdığı bu konuya mükemmel bir cevap buldum.

http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/

Aşağıdakileri Migration yapılandırma dosyasında değiştirdim.

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

Umarım bu, sıkıntıda başka birine yardımcı olur.


Ad alanı değişikliklerinden sonra benzer bir durum yaşadım. Bu düzeltmeyi denedim ama yine de işe yaramadı. Bu yüzden veritabanı tablosundaki ad alanlarını manuel olarak değiştirdim ve sonra çalışmaya başladı.
kosist

0

Sadece update-migration -Script komutunu çalıştırın. Bu, geçişe dahil olan tüm DB değişikliklerini içeren yeni * .sql komut dosyası oluşturur. Kodun sonuna aşağıdaki gibi komutlar ekleyin: INSERT [dbo]. [__ MigrationHistory] ([MigrationId], [ContextKey], [Model], [ProductVersion]) bunu çalıştırabilirsiniz, tüm INSERT ve DB senkronize edilecektir


0

Bir saatten fazla sonuç alamadığım için geçişleri kullanmadan başka bir yaklaşımı denedim ama bir şema karşılaştırması yaptım.

Visual Studio -> Araçlar -> SQL Server -> Yeni Şema Karşılaştırması

İlk olarak EF geçişleri ile tamamen yeni bir veritabanı oluşturdum. Daha sonra yeni veritabanını güncellemek istediğim veritabanıyla karşılaştırarak bir karşılaştırma yaptım. Sonunda bir geçiş betiği oluşturdum ve bir şema güncellemesi gerçekleştirebildim.


0

Benim durumumda (sıfırlamak ve yeni bir veritabanı almak istiyorum),

İlk önce hata mesajını aldım: There is already an object named 'TABLENAME' in the database.

ve biraz önce gördüm:

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

Veritabanım oluşturuldu, ancak geçiş geçmişinde kayıt yok.

Dbo .__ MigrationsHistory dışındaki tüm tabloları bırakıyorum

GöçlerTarih boştu.

Çalıştırmak dotnet ef database update -c StudyContext --verbose

(- sadece eğlence için verbose)

ve var Done.


0

Aşağıdaki ile aynı hatayla karşılaştım. Sonra aşağıdaki gibi düzelttim:

  1. Projenizdeki mevcut veritabanlarını kontrol edin:
    • dotnet ef migrations list
  2. En yenisi eklediğiniz şeyse, kaldırın:
    • dotnet ef migrations remove
  3. Bu veritabanının garanti çıktıları, kaynak kodunda tespit edilmelidir: .cs / .Designer.cs dosyaları

4. şimdi iyi. Yeniden eklemeyi deneyin: dotnet ef migrations add [new_dbo_name]

5. Son olarak, geçiş listesindeki düzenleme bazında tekrar güncellemeyi deneyin:

  • dotnet ef database update [First]
  • dotnet ef database update [Second]
  • ...
  • dotnet ef database update [new_dbo_name]

Umarım size yardımcı olur. ^^


0

Paket yöneticisi konsolunda "update-database" komutunu çalıştırmaya çalıştığınızdan daha fazla taşıma klasörünü sildiniz mi? Öyleyse

Sadece tüm tablolarınızı manuel olarak silin, eğer güncelleme veri tabanını çalıştırırsa çalıştır (eksi çekirdek verileri silinecektir)


0

Bunu yapmanın bir başka yolu, İlk Sınıfta, Yukarı ve Aşağı Yöntemler arasındaki her şeyi yorumlamaktır.Sonra, çekirdek yöntemini çalıştırdıktan sonra güncelleme-veritabanını çalıştırın, bu nedenle güncelleme-veritabanını tekrar çalıştırın.Bazı arkadaşlara yardımcı olabilir.


0

Ben de aynı sorunla karşı karşıyaydım. Aşağıdaki çözümü denedim: 1. Up () 'dan tablo oluşturma kodunu ve Down () yönteminden ilgili kodu sildim 2. Paket Yöneticisi Konsolunda güncelleme-veritabanı komutunu çalıştırın

bu benim sorunumu çözdü


0

Not: Veritabanımda hiçbir şey olmadığı için yaptım. Benim durumumda: 1. Ben komut tarafından bir göç kaldırıldı kaldırma-göç içinde Paket Yöneticisi Konsolundan 'SQL Server Nesne Explorer' panel tarafından 2. Kaldırılan veritabanı> geçerli veritabanı> sağ tıklama> 3. göç Kaldır Paket Yöneticisi Konsolu yazma Ekle -Migration ve Enter'a tıklayın 4. Komut güncelleme veritabanı ile son güncelleme


0

Aynı durum (Sunucuda DB ve MigrationHistory tablosu yok). Adımlarım:

  1. İlk taşıma işlemimin Yukarı ve Aşağı bölümlerinden Taşıma verilerini sildim.
  2. Veritabanını boş geçişle güncelleyin (MigrationHistory tablosu oluşturuldu)
  3. GERÇEK geçişinizi ekleyin ve bununla veritabanını güncelleyin.

0

Veritabanında, __MigrationHistory tablosunu sorgulayın ve [ContextKey] 'i kopyalayın.

Aşağıdaki gibi DbMigrationsConfiguration ConextKey'e yapıştırın

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

0

Aşağıdaki adımlar aynı sorun için benim için çalıştı:

Senaryo:

E-posta işlevi için mevcut modelime 2 yeni alan eklemeye çalışıyordum. Yeni alanlar "IsEmailVerified" ve "ActivationCode" dir.

İzlediğim adımlar:

1. "Migrations" klasörünün altında Update-Database yapmamı engelleyen eski taşıma dosyalarını sildi 2. Modelde yaptığım tüm son değişikliklerimi geri aldım

3. Aşağıdaki komutu çalıştırın:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Veri Kaynağı = DESKTOP \ SQLEXPRESS; İlk Katalog = Özel; Kalıcı Güvenlik Bilgisi = Doğru; Kullanıcı Kimliği = sa; parola = **** "

4. Up () ve Down () yöntemlerinin içeriğini taşıma dosyasından sildi ve yöntemleri boş bıraktı

5. Aşağıdaki komutu çalıştırın:

Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Veri Kaynağı = DESKTOP \ SQLEXPRESS; İlk Katalog = Özel; Kalıcı Güvenlik Bilgisi = Doğru; Kullanıcı Kimliği = sa; şifre = " ***

  1. Yukarıdaki adımı uyguladıktan sonra model ve DB senkronize görünüyor.

  2. Şimdi, modele yeni özellikleri ekledim

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. Aşağıdaki komutu çalıştırın:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Veri Kaynağı = DESKTOP \ SQLEXPRESS; İlk Katalog = Özel; Kalıcı Güvenlik Bilgisi = Doğru; Kullanıcı Kimliği = sa; parola = " ***

  1. Artık taşıma dosyası yalnızca aşağıdaki gibi son değişikliklerimi içerir:

       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. Aşağıdaki komutu çalıştırın: Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

11. Şimdi veritabanını ek sütunlarla başarıyla güncelledim.

Aşağıdaki tablo, son değişikliklerden sonra güncellenmiştir:

Güncelleme geçişinden sonraki tablo


gerçekten bunu önermeyin, ürün geçişlerinde ürünün silinmesi ortamınızı yok edecektir. Şimdiye kadar çalıştılarsa neden taşımalarınızı silmeniz gerekiyor? ve siz bağlantı dizeleri buradaki her kullanıcı için çalışmaz, onları bu şekilde çalıştırmamalısınız
rakuens

-5

Taşıma dosyasında genel geçersiz kılma void Up () yöntemini kontrol edin . Zaten veritabanında bulunan yeni bir db nesnesi oluşturmaya çalışıyor olabilirsiniz. Bu nedenle, db nesnesini oluşturmadan önce bu nesneyi / tabloyu bırakmanız gerekir. Sadece feryat gibi

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

Ve şimdi geçişinizi çalıştırın Update-Database -TargetMigration: "2016_YourMigration"


6
Bunu yaparsanız tüm verilerinizi kaybedersiniz
Mehdiway
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.