Veritabanı oluşturulduğundan beri 'ApplicationDbContext' bağlamını destekleyen model değişti


86

Öncelikle, bu hatayı başka hiçbir yerde görmedim ve sanırım bu bir kopya değil, bu yüzden lütfen önce tüm durumu okuyun.

Her şey gayet iyi çalışıyordu, sonra aşağıda listeleyeceğim model sınıflarımdan birini güncellemeye çalıştım ( Uygulama sınıfı ve güncelleme artık yorumlandı); ve bum bu çirkin hatayı yaşadım.


Veritabanı oluşturulduğundan beri 'ApplicationDbContext' bağlamını destekleyen model değişti. Veritabanını güncellemek için Code First Migrations'ı kullanmayı düşünün ( http://go.microsoft.com/fwlink/?LinkId=238269 ). System.Data.Entity.CreateDatabaseIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf1.b__e () at System.Data.Entity.Internal.InternalContext.PerformInitializationAction (Eylem eylemi) System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization () at System.Data.Entity. 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(ActionSystem.Data.Entity.Internal.LazyInternalContext.InitializeDatabase () at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseType ( ) at System.Data.Entity.Internal.RetryAction 1 eyleminde Internal.LazyInternalContext.b__4 (InternalContext c) entityType) at System.Data.Entity.Internal.Linq.InternalSet1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable1. System.Data.Entity.Infrastructure.DbQuery 1 kaynağında, Dize yolu) System.Data.Entity.QueryableExtensions için (Dize yolu) ekleyin 1 source, Expression. Microsoft.AspNet.Identity'de [T, TProperty] (IQueryable 1 yolu) ekleyin . EntityFramework.UserStore 6.GetUserAggregateAsync(Expression1 filtresi) Microsoft.AspNet.Identity.EntityFramework.UserStore'da 2. 6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManagerFindByNameAsync (String userName) Microsoft.AspNet.Identity.UserManager`2.d__12.MoveNext () --- Önceki konumdan yığın izlemenin sonu System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess'te (Task görevi) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task) içinde ControlPanel.Web.Controllers.AccountController.deb. : \ Projects \ FULL \ Control Panel \ ControlPanel.Web \ Controllers \ AccountController.cs: satır 56

İlk başta bunun bir geçiş sorunu olabileceğini düşündüm, bu yüzden veritabanını tamamen bıraktım, geçişleri yeniden etkinleştirdim ve bir Init geçişi ekledim ve kullanarak veritabanını güncelledim

update-database -force -verbose

Her şey şikayet olmadan iyi gidiyor, ancak siteme giriş yapmaya çalıştığımda önceki hatayı alıyorum. Sorunu çözemeden göç olayını yaklaşık on kez yaptım.

Etki alanı sınıflarım (modeller):

public class App
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int AppId { get; set; }
    //[Required]
    public virtual string FacebookId { get; set; }
    //[Required]
    public virtual string Secret { get; set; }      
    public virtual List<User> Users { get; set; }
    public virtual List<Post> Posts { get; set; }      
    //public virtual ApplicationUser Admin { get; set; }
}

public class Post
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int PostId { get; set; }
    public virtual string Content { get; set; }
    public virtual string Link { get; set; }
    public virtual string Image { get; set; }
    public virtual bool IsSpecial { get; set; }
    //[Required]
    public virtual App App { get; set; }
    //[Required]
    public virtual DateTime? PublishDate { get; set; }
}

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int UserId { get; set; }

    [MaxLength(500)]
    public virtual string FacebookId { get; set; }

    [MaxLength(500)]
    public virtual string Token { get; set; }

    //[Required]
    public virtual App App { get; set; }
}

İşte IdentityModellerim:

public class ApplicationUser : IdentityUser
{
    public virtual List<App> Apps { get; set; }
    public bool? IsPremium { get; set; }
    [DataType(DataType.Date)]
    public DateTime? LastPublishDateTime { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("dCon")
    {
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUser>().ToTable("Admins");
        modelBuilder.Entity<ApplicationUser>().ToTable("Admins");
        modelBuilder.Entity<IdentityUserRole>().ToTable("AdminRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("Logins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("Claims");
        modelBuilder.Entity<IdentityRole>().ToTable("Roles");
    }
}

Bu sorunu başka bir yerde görmediğinizden emin misiniz? Bu bağlantı ne olacak? stackoverflow.com/questions/3600175/…
AndreCruz

4
Hayır, aynı değiller, sizi temin ederim, orada sağlanan çözümü hiç sonuç olmadan denedim, onların hatası diyor ki: Ya veritabanını manuel olarak sil / güncelle, oysa benimki şöyle diyor: Code First Migrations kullanmayı düşünün veritabanını güncellemek için
a7madx7

Yanıtlar:


140

Sadece benim gibi bir veritabanı ilk uygulamasını yapan başka birinin tökezlemesi durumunda.

ApplicationUserSınıfı genişleterek , AspNetUserstabloya yeni bir alan ekleyerek bir değişiklik yaptım ve ardından başlangıçta bu hatayı aldım .

__MigrationHistoryTabloda oluşturulan kaydı silerek bunu çözebildim (orada yalnızca bir kayıt vardı) EF'in veri tabanımı taşıma aracını kullanarak güncellemem gerektiğine karar verdiğini varsayıyorum - ancak bunu zaten kendim el ile yapmıştım.


1
Önce veritabanı da ve bu onu düzeltti. Buradaki tek kayıt, ilk önce kodun gerçekleştiği ilk kayıttı, ancak önce veritabanını kullandıktan ve MS SQL sunucusundaki tabloyu değiştirdikten sonra onu değiştirdim.
SolidSnake4444

Çalıştı. İskeleli bir görünüm eklediğimde hata aldım. Görünümün veri bağlamı sınıfı şuyduApplicationDbContext
Vincent Saelzler

79

Bu benim için çalıştı - başka değişiklik gerekmiyor.

DELETE FROM [dbo].[__MigrationHistory]

1
Benim için de çalıştı. Çok garip bir çözüm. Tarihte kırık bir göç yaşandığını düşünüyorum. Tüm geçişleri silmeye ve ilkini yeniden oluşturmaya çalışacağım.
hakan

1
@Dave Voyles bu SQL'i doğrudan SSMS'de çalıştırabilirsiniz
Daniel de Zwaan

1
Benim için de çalıştı. Bir veritabanında bu tablo varken başka bir veritabanında mevcut değildi
Tejas

1
Kodlarım son model güncellemesine kadar sorunsuz çalıştığı için yukarıdaki cevaplar bana yardımcı olamaz. Cevabınız hile yaptı. Şerefe ahbap!!
Sithu

3
Bu benim için işe yaramadı ve veritabanını silmeme, geçişleri yeniden çalıştırmama ve verileri yeniden eklememe gerek duymama neden oldu. DİKKAT.
adamonstack

35

Bu gönderi sorunumu çözdü. Bu aşağıdaki satırı ekleyerek ilgili hepsi Application_Start()de Global.asax:

Database.SetInitializer<Models.YourDbContext>(null);

Ancak modelinizdeki her düzenleme için veritabanının yeniden oluşturulmasına neden olur ve verilerinizi kaybedebilirsiniz.


4
Verilerimin zarar görmesini veya kaybolmasını istemiyorum.
Roohullah Allem

En iyi yaklaşım bu değil efendim. Çözüm Ama güvenilir değil
Ahsan Aftab

14

"[__MigrationHistory]" tablosunu "veritabanı> Sistem Tablolarından" silerseniz, o zaman çalışacaktır.


İşe yarıyor. Ancak [__MigrationHistory] tabloyu sildikten sonra sadece EDMX mm modelini de güncelleyin.
DmitryBoyko

12

O kadar garip bir hataydı ki, sonunda benim hatam değildi, Microsoft'a aitti, Varlık çerçevesini "yayın öncesi" sürüm olarak kurdum ve bu hatadan sorumluydu ,, kararlılığa yükselttiğimde serbest bırakıldı, teşekkür ederim bu soruyu sorduğumda bana inanın, çözümü için bir hafta kadar aradım, bu yüzden bu sorunun başka bir yerde olmadığından oldukça eminim: varlık framework.dll sürümü yardımcı olursa sorun 6.0.2 idi.


12

Bu hatadan herkes baş ağrısı çekiyor : Tüm projelerinizin aynı Entity Framework derlemesine bir başvurusu olduğundan kesinlikle emin olun.

Uzun hikaye:

Modelim ve uygulamam farklı montajlardı. Bu derlemeler, Varlık çerçevesinin farklı bir sürümüne referans veriyordu. Sanırım iki sürüm aynı model için farklı bir kimlik oluşturdu. Dolayısıyla, uygulamam çalıştırıldığında modelin kimliği __MigrationHistory'deki en son geçişlerden biriyle eşleşmedi. Tüm referansları en son EF sürümüne güncelledikten sonra hata bir daha asla görünmedi.


evet, benim durumum buydu, çoğu proje ef6.1.3'teydi, yeni oluşturulan test projesi ise bir şekilde ef6.0 ile yapıldı.
ZZZ

7

Bu sorunu çözmek için günler harcadım, birçok farklı gönderiyi analiz ettim ve birçok seçeneği denedim ve sonunda düzelttim. EF kodu ilk geçişlerini kullanan çözümümdeki bu 2 proje:

  • Tüm kod ilk varlıklarımı, DbContext, Mirgations ve jenerik depomu içeren esas olarak derleme olarak kullanılan Konsol Uygulaması "DataModel". Paket Yöneticisi Konsolundan geçişler oluşturabilmek için bu projeye ayrı bir boş yerel veritabanı dosyası (DataModel / App_Data klasöründe) ekledim.
  • DataModel projesine başvuran ve projeye dahil olmayan WebApi / App_Data klasöründen yerel veritabanı dosyasını kullanan WebApi

WebApi istendiğinde bu hatayı aldım ...

Çevrem:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional ve Güncelleştirme 1
  • .NET Framework 4.6.1'i hedefleyen tüm projelerim
  • NuGet'ten EntityFramework 6.1.3

Belirtilen istisnalardan kaçınmak için dikkat etmeniz gereken tüm açıklamaları ve karşılanması gereken tüm koşulları / gereksinimleri burada topladım:

  1. Çözümünüzdeki tüm projeler için EntityFramework Nuget paketinin yalnızca bir sürümünü kullanmalısınız.
  2. Tüm geçiş komut dosyalarının sıralı olarak çalıştırılmasıyla oluşturulan veritabanı, hedef veritabanıyla aynı yapıya / şemaya sahip olmalı ve varlık modeline karşılık gelmelidir. Aşağıdaki 3 şey birbiriyle tam olarak eşleşmeli / yansıtmalı / eşleşmelidir:
    • Sona kadar tüm taşıma komut dosyanız
    • Geçerli kod ilk varlık modeli durumu (DbContext, varlıklar)
    • Hedef veritabanı
  3. Hedef veritabanı (mdf dosyası) güncellenmeli / son taşıma betiğine karşılık gelmelidir. Hedef veritabanınızdaki "__MigrationHistory" tablosunun sahip olduğunuz tüm geçiş komut dosyalarının kayıtlarını içerdiğini doğrulayın; bu, tüm geçiş komut dosyalarının bu veritabanına başarıyla uygulandığı anlamına gelir. Veritabanınıza karşılık gelen doğru kod ilk varlıkları ve bağlamı oluşturmak için Visual Studio'yu kullanmanızı öneririm, Project -> Yeni Öğe Ekle -> ADO.NET Varlık Veri Modeli -> Veritabanından Kod İlk: Elbette, alternatif olarak, eğer veritabanınız yok, manuel olarak model yazabilirsiniz (kod ilk varlıklar ve bağlam) ve ardından ilk geçişi ve veritabanı oluşturabilirsiniz.
  4. Bağlantı dizesinin adı, örneğin başlangıç ​​projesinin yapılandırma dosyasındaki MyConnectionString (Web.config / App.config):

    <configuration>
      <connectionStrings>
        <add name="MyConnectionString" connectionString="...">
      </connectionStrings>
    <configuration>
    

    DbContext'inizin yapıcısında iletilen parametreye eşit olmalıdır:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
    
  5. Paket Yöneticisi Konsolu'nu kullanmadan önce , güncelleme veya geçiş oluşturmak için doğru veritabanını kullandığınızdan ve gerekli projenin çözümün başlangıç ​​projesi olarak ayarlandığından emin olun . Veritabanına bağlanmak için, projede başlangıç ​​projesi olarak ayarlanan .config dosyasındaki bağlantı dizesini kullanır.
  6. Ve sorunumu çözen ana sorun: Garip, ancak WebApi / bin klasörümde DataModel.exe eskiydi, son derlemeden bu yana yenilenmemişti. Geçişler derleme DataModel.exe'ye gömüldüğünden, WebApi veritabanım eski yansıtmaları kullanarak güncelledi. Veritabanını WebApi'de güncelledikten sonra neden DataModel'deki en son geçiş betiğine karşılık gelmediğini kafam karıştı. Aşağıdaki kod, WebApi / App_Data klasörümdeki en son taşıma yerel veritabanını otomatik olarak oluşturur (yoksa) veya günceller.

       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...
    

    Çözümü temizlemeyi ve yeniden oluşturmayı denedim, ancak işe yaramadı, WebApi'den bin ve obj klasörlerini tamamen kaldırdım, veritabanı dosyalarını WebApi / App_Data'dan sildim, WebApi'yi oluşturdum, yeniden başlattım, ona istekte bulundum, doğru veritabanı oluşturdu - tembel başlatma (kullanarak En son geçişe karşılık gelen ve istisna daha fazla görünmedi. Bu, sorununuzu çözebilir:

    1. manuel olarak bin, obj klasörlerini başlangıç ​​projenizden kaldırın (veritabanınızı oluşturur / günceller)
    2. Başlangıç ​​projenizi oluşturun veya tüm çözümünüzü daha iyi temizleyin ve yeniden oluşturun.
    3. projeyi başlatarak (yukarıdaki satırları çalıştıracak) veritabanını yeniden oluşturun veya Paket Yöneticisi Konsolu "güncelleme-veritabanı" komutunu kullanın.
    4. oluşturulan db ve __MirgationHistory'nin en son geçiş komut dosyasına karşılık gelip gelmediğini manuel olarak kontrol edin.

3

Bir model özelliğinin veri açıklamasını değiştirdiğinizde bu olabilir. örneğin: [Gerekli] ekleme bir özelliğe veritabanı tasarımında bekleyen bir değişikliğe neden olur.

En güvenli çözüm, Paket Yöneticisi Konsolunda çalıştırmaktır:

add-migration myMirgrationName

Up () yöntemindeki tam değişiklikleri gösterecektir. Bu nedenle, bu tür değişiklikleri gerçekten uygulamak isteyip istemediğinize şu yollarla karar verebilirsiniz:

update-database

Aksi takdirde, __MigrationHistory tablosundan ve Migrations klasöründen Çözüm Gezgini'nden en son geçişi silebilirsiniz.


Bu kesinlikle burada gördüğüm en iyi cevap. Göç tarihini silme önerisi bence çok kötü bir fikir!
mgrenier

Yorumun için teşekkürler. Ayrıca genellikle geçiş geçmişini silmeyi önermiyorum, ancak özellikle, önceki geçiş noktası çok farklı değildi - yani OP tarafından çok fazla model değişikliği yapılmamıştı - bu yüzden tek bir geri adımın yardımcı olabileceğini düşündüm , yalnızca son taşıma (lar) kayıtlarını silerek.
Mohamed Nagieb

3

DataBase'inizdeki _MigrationHistory'deki geçiş Geçmişini silin. Benim için çalıştı


2

A7madx7 ile aynı sorunu yaşıyordum, ancak kararlı EF sürümü (v6.1.1) ile ve şurada yayınlanan çözüm buldum:

http://cybarlab.com/context-has-changed-since-the-database-was-created

varyasyonlu: http://patrickdesjardins.com/blog/the-model-backing-the-context-has-changed-since-the-database-was-created-ef4-3

2. bağlantı, VB için belirli bir sözü içerir ..... "bu sorunu yaşayan tüm veritabanı içeriğini, global.asax dosyasındaki app_start yönteminize şu şekilde ekleyebilirsiniz" :

Database.SetInitializer(Of DatabaseContext)(Nothing)

Not: "DatabaseContext" i DbContext uygulayan sınıfımın adıyla değiştirmek zorunda kaldım

Güncelleme: Ayrıca, var olan tablolara bağlanmak için ilk kod yaklaşımını kullanırken, EF'nin eşlemeleri depolamak için bir "_migrationhistory" tablosu oluşturup oluşturmadığını görmek için veritabanını kontrol edin. Bu tabloyu yeniden adlandırdım ve ardından SetInitializer'ı global.asax'tan kaldırabildim.


1

Web sitesi klasöründeki tüm dosyaları silerek ve ardından yeniden yayınlayarak benzer bir sorunu çözdüm.


1

tüm tablo kimliğini kaldır

Delete _MigrationHistory
Delete AspNetRoles
Delete AspNetUserClaims
Delete AspNetUserLogins
Delete AspNetRoles
Delete AspNetUser

1

Araçlar menüsünden NuGet Paket Yöneticisi'ni ve ardından Paket Yöneticisi Konsolu (PMC) öğesini tıklayın. PMC'ye aşağıdaki komutları girin.

Enable-Migrations Add-Migration Init Update-Database Uygulamayı çalıştırın. Sorunun çözümü buradan


1

Geliştirme yaparken, Göçleri yapılandırmak için bu pratik sınıfı kullanmayı tercih ediyorum.

Umarım yardımcı olur.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
        this.Configuration.LazyLoadingEnabled = false;
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

        Database.SetInitializer(new StackOverflowInitializer());
    }

    public class StackOverflowInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
    {
        public StackOverflowInitializer()
        {
            // TODO NOTHING, COMMENT ALL

            // IF CHANGES, RECREATE
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ApplicationDbContext>());

            // CREATE ONLY NOT EXITS
            //Database.SetInitializer<Context>(new CreateDatabaseIfNotExists<ApplicationDbContext>());
        }

    }

    public System.Data.Entity.DbSet<stackoverflow.Models.Company> Companies { get; set; }

}

0

Eski productVersion ile [__MigrationHistory] tablosundaki Satırları silmek benim için çalıştı. Bu cevap, [__MigrationHistory] tablosunun tamamını silmek istemeyenler içindir. Ürün Sürümü Sütunundaki eski sürüme sahip satırları silin. Umarım birine yardımcı olur!


0

Aşağıda karşılaştığım benzer türde bir hata vardı

'PsnlContext' bağlamını destekleyen model, veritabanı oluşturulduğundan beri değişti. Veritabanını güncellemek için Code First Migrations kullanmayı düşünün ( http://go.microsoft.com/fwlink/?LinkId=238269 ).

Hatayı çözmek için Global.asax'ın Application Start olayına aşağıdaki bölümü ekledim

Database.SetInitializer (null);

Bu sorunu çözdü


0

basitçe hata, modellerinizde değişiklikler olduğu ve DB ile Senkronize olmadığı anlamına gelir, bu nedenle paket yöneticisi konsoluna gidin, add-migration foo2 bu, soruna neyin neden olduğuna dair bir ipucu verecektir, bir şeyi kaldırmış olabilirsiniz veya benim durumumda bir veri açıklamasını kaldırabilirim . oradan değişikliği alabilir ve umarım modelinizde tersine çevirebilirsiniz.

bundan sonra foo2'yi silin.


0

Geç kaldığımı biliyorum ama ben de katkıda bulunmak istiyorum. Bu hata gerçekten gariptir, çünkü tarayıcı, sınıflar ve özellikleri değişmiş olabilir ancak veritabanına bağlanmamış olabileceğinden, değişikliklerin nasıl işlenmesi gerektiğini anlayamaz.

Öyleyse bir şey yap,

bir göç yaratmak Paket Yöneticisi Konsolu (Araçlar> Nuget Paket Yöneticisi> Paket Yöneticisi Konsolu) Bu komutu kullanarak:

add-migration UpdateMigration

UpdateMigration, Taşıma işleminizin adıdır. İstediğiniz herhangi bir adı verebilirsiniz, ancak lütfen spesifik olun.

Bundan sonra, sadece veritabanını güncellememiz gerekiyor, bu yüzden şunu çalıştırın:

veri tabanını güncelle

Artık değişikliklerinizi veritabanına kaydettiğinize göre, tarayıcınızı yenileyin ve işte başlayın!

Bu yardımcı olur umarım.


0

bu, modelinizden birine bazı özellikler eklediğiniz ve eklemediğiniz için gelir update-Database. bunu çözmek için onu modelden çıkarmanız veya add-migration anyProperName bu özelliklerle yapmanız gerekir ve Update-database.


0

Bu hata, Modelimde değişiklik yaptığımda ve veritabanını güncellemek için değişiklikler için geçiş yapmadığımda ortaya çıktı.

Code First Migration Schema'da modelinizde daha önce değişiklik yaptıysanız

Göç eklemeyi unutmayın

add-migration UpdatesToModelProperites 

Yukarıdaki komut, modelde yaptığınız tüm değişiklikleri okuyacak ve Up () ve Down () yöntemlerine yazacaktır.

Ardından aşağıdaki komutu kullanarak veritabanınızı güncellemeniz yeterlidir.

update-database

Bu benim için çalıştı.


-2

Mevcut veritabanını silin, aynı adla yeni bir veritabanı oluşturun, tüm verileri kopyalayın ... çalışacaktır

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.