.net asp.net - Das Modell, das den 'ApplicationDbContext'-Kontext unterstützt, hat sich seit der Erstellung der Datenbank geändert




mvc tutorial (13)

Nur für den Fall, dass jemand darüber stolpert, der wie ich eine Datenbank-Implementierung durchführt.

Ich habe eine Änderung vorgenommen, indem ich die ApplicationUser Klasse erweitert, der AspNetUsers Tabelle ein neues Feld AspNetUsers habe und diesen Fehler beim Start hatte.

Ich konnte dies beheben, indem ich den in der __MigrationHistory Tabelle erstellten Datensatz __MigrationHistory (es gab nur einen Datensatz). Ich nehme an, dass EF entschieden hat, dass ich meine Datenbank mit dem Migrationstool aktualisieren musste - aber ich hatte dies bereits manuell getan.

Zuallererst habe ich diesen Fehler nirgendwo anders gesehen und ich denke, es ist kein Replikat, also lies bitte zuerst die ganze Situation

Alles funktionierte gut, dann habe ich versucht, eine meiner Modellklassen zu aktualisieren (die App-Klasse und das Update ist jetzt kommentiert), die ich unten auflisten werde und Boom hatte ich diesen hässlichen Fehler.

Das Modell, das den 'ApplicationDbContext'-Kontext unterstützt, hat sich seit der Erstellung der Datenbank geändert. Erwägen Sie, Code First Migrations zu verwenden, um die Datenbank zu aktualisieren ( http://go.microsoft.com/fwlink/?LinkId=238269 ). bei System.Data.Entity.CreateDatabaseIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf 1.b_e () bei System.Data.Entity.Internal.InternalContext.PerformInitializationAction (Aktion Aktion ) bei System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization () bei System.Data.Entity.Internal.LazyInternalContext.b _4 (InternalContext c) bei System.Data.Entity.Internal.RetryAction 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action 1-Aktion) bei System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase () bei System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType (Type entityType) bei System.Data .Entity.Internal.Linq.InternalSet 1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet 1.Include (String-Pfad) bei System.Data.Entity.Infrastructure.DbQuery 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable 1 Quelle, String-Pfad) bei System.Data.Entity.QueryableExtensions.Include [T, TProperty] (IQueryable 1 source, Expression 1 Pfad) bei Microsoft.AspNet.Identity.EntityFramework.UserStore 6.GetUserAggregateAsync(Expression 1 Filter) um Microsoft.AspNet.Identity.EntityFramework.UserStore 6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager 2.FindByNameAsync (String userName) unter Microsoft.AspNet.Identity.UserManager`2.d_ 12.MoveNext () - - Ende des Stack-Trace vom vorherigen Speicherort, an dem die Ausnahme ausgelöst wurde - bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task-Task) unter System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task-Task) bei ControlPanel.Web.Controllers. AccountController.d _2.MoveNext () in d: \ Projekte \ FULL \ Systemsteuerung \ ControlPanel.Web \ Controllers \ AccountController.cs: Zeile 56

Zuerst dachte ich, es könnte ein Migrationsproblem sein, also habe ich die Datenbank komplett gelöscht, die Migrationen wieder aktiviert, eine Init-Migration hinzugefügt und die Datenbank mit aktualisiert

update-database -force -verbose

Jede Sache geht gut, keine Beschwerden, aber wenn ich versuche, mich auf meiner Website einloggen, bekomme ich den vorherigen Fehler, ich habe die Migration Sache etwa zehn Mal, ohne in der Lage, das Problem zu lösen ..

Hier sind meine Domain-Klassen (Modelle):

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

Hier sind meine IdentityModels:

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

Löschen Sie die Tabelle "[__MigrationHistory]" aus Ihrer "Datenbank> Systemtabellen". Es funktioniert einwandfrei.


Klicken Sie im Menü Extras auf NuGet Package Manager und dann auf Package Manager Console (PMC). Geben Sie die folgenden Befehle in das PMC ein.

Aktivieren-Migrationen Add-Migration Init Update-Datenbank Führen Sie die Anwendung aus. Die Lösung für das Problem ist von hier


Löschen Sie vorhandene Datenbank, erstellen Sie neue Datenbank mit demselben Namen, kopieren Sie alle Daten ... es wird funktionieren


Dieser post mein Problem behoben. Es geht darum, die folgende Zeile in Application_Start() in Global.asax :

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

Es führt jedoch bei jeder Bearbeitung in Ihrem Modell zu einer Wiederherstellung der Datenbank und Sie können Ihre Daten verlieren.


Ich habe gerade ein ähnliches Problem gelöst, indem ich alle Dateien im Website-Ordner löschte und dann neu veröffentlichte.


Entferne alle Tabellenidentitäten

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

Jeder bekommt Kopfschmerzen von diesem Fehler: Stellen Sie absolut sicher, dass alle Ihre Projekte einen Verweis auf die gleiche Entity Framework-Assembly haben.

Kurzgeschichte lang:

Mein Modell und meine Anwendung waren in verschiedenen Baugruppen. Diese Assemblys verwiesen auf eine andere Version von Entity Framework. Ich vermute, dass die beiden Versionen für das gleiche Modell eine andere ID generiert haben. Wenn meine Anwendung lief, stimmte die ID des Modells nicht mit der letzten Migration in __MigrationHistory überein. Nach dem Aktualisieren aller Verweise auf die neueste EF-Version wurde der Fehler nie wieder angezeigt.


Dies funktionierte für mich - keine weiteren Änderungen erforderlich.

DELETE FROM [dbo].[__MigrationHistory]

Wenn ich mich entwickle, bevorzuge ich diese praktische Klasse, um Migrationen zu konfigurieren.

Ich hoffe es hilft.

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 Initializer());
    }

    public class Initializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
    {
        public Initializer()
        {
            // 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<.Models.Company> Companies { get; set; }

}

Es war so ein seltsamer Fehler ,, Es war nicht mein Fehler am Ende, es war Microsofts ,, Ich installierte das Entity-Framework die "Pre-Release" -Version und es war verantwortlich für diesen Fehler ,, als ich auf den Stall aufgerüstet habe release es verschwindet ,, danke, jeder glaubt mir, wenn ich diese Frage gestellt habe ich suchte für eine Woche oder so für seine Lösung, so dass ich mir ziemlich sicher bin, dass dieses Problem nicht woanders ist: die Version von entity framework.dll, die verursacht Problem war 6.0.2 wenn es hilft.


Dies kann passieren, wenn Sie die Datenannotation einer Modelleigenschaft ändern. Wenn Sie beispielsweise [Erforderlich] zu einer Eigenschaft hinzufügen, wird eine ausstehende Änderung im Datenbankentwurf verursacht.

Die sicherste Lösung ist die Ausführung in der Package Manager-Konsole:

add-migration myMirgrationName

Dies zeigt die genauen Änderungen in der Up () -Methode an. Daher können Sie entscheiden, ob Sie solche Änderungen wirklich über das folgende System anwenden möchten:

update-database

Andernfalls löschen Sie möglicherweise nur die letzte Migration aus der Tabelle __MigrationHistory und aus dem Migrationsordner den Projektmappen-Explorer.


Was ich tun würde, ist AuthorizeAttribute ableiten und seine HandleUnauthorizedRequest überschreiben, um HTTP-Statuscode 403 zurückzugeben, wenn Benutzer authentifiziert wird. Ich würde dann einen Abschnitt system.webServer \ httpErrors zu meiner Web.Config hinzufügen, um den Standard 403 durch meine benutzerdefinierte Seite zu ersetzen (dieser letzte Teil erfordert IIS 7+). Hier ist wie:

public class MyAuthorizeAttribute : AuthorizeAttribute {
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
            filterContext.Result = new HttpStatusCodeResult(403);
        else
            filterContext.Result = new HttpUnauthorizedResult();
    } 
}

<configuration>
  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="403" />
      <error statusCode="403" responseMode="ExecuteURL" path="/Error/MyCustom403page" />
    </httpErrors>
  </system.webServer>
</configuration>




.net asp.net-mvc linq entity-framework asp.net-mvc-5