webentwicklung-frage-antwort-db.com.de

Gerüstcontroller funktioniert nicht mit Visual Studio 2013 Update 3 und 4

Im Visual Studio 2013 (Update 3 und 4) kann kein Controller (MVC5-Controller mit Ansichten, mithilfe von Entity Framework) eingerichtet werden. Die Fehlermeldung ist unten:

Beim Ausführen des ausgewählten Codegenerators ist ein Fehler aufgetreten: 

A configuration for type 'Library.Morthwind.Models.Catgeory' has already been added. To reference the existing configuration use the Entity<T>() or ComplexType<T>() methods

Ich habe die Modelle erstellt, indem Sie "Reverse Engineer Code First" im Tool-Menü "Entity Framework Power Tools Beta 4" auswählen.

Irgendwelche Ideen, was diesen Fehler verursachen könnte?

42
SimonB

Ich hatte heute das gleiche Problem. 

Ich hatte eine benutzerdefinierte Konfiguration für eine meiner Model-Klassen hinzugefügt, um mithilfe der fließenden API eine Beziehung hinzuzufügen. Dies wurde in meiner dbContext-Klasse in der OnModelCreating-Überschreibung folgendermaßen angegeben:

modelBuilder.Configurations.Add(new OrderConfiguration());

Durch Auskommentieren der obigen Zeile konnte das Gerüst Controller wie erwartet ausgeführt werden.

VS 2013 Update 2 hatte ein Problem und das Gerüst hatte einen nicht hilfreichen Fehler ohne weitere Informationen. Im installierten Update 3 gab es gerade genug Details, um das zugrunde liegende Problem zu finden. 

Jeff.

39
Jeff

Ich habe auch dieses Problem gehabt. Jeffs Lösung funktioniert in einigen Fällen. Da mein DbContext jedoch mit mehr Modellen wuchs, für die Schlüssel zugeordnet werden mussten, konnte ich die Configurations.Add () -Methoden nicht löschen, da ich dann Fehlermeldungen erhielt, die EF nicht in der Lage war, Primärschlüssel zu finden. 

Ich entdeckte, dass ich durch das Ändern meiner abgeleiteten DBContext-Klasse zur Verwendung von IDbSet-Eigenschaften anstelle von DbSet die Controller und Ansichten problemlos generieren konnte. Für mich führte dies jedoch zu einem anderen Problem: IDbSet unterstützt die asynchronen Methoden nicht.

Es scheint, dass ich entweder nicht-asynchrone Controller mit vorhandenen Konfigurationen oder asynchrone Methoden ohne Konfigurationsklassen generieren kann.

Wenn Ihre Kontexteigenschaften vom Typ DbSet sind, ändern Sie sie in IDbSet. Wenn Sie keine asynchronen Controller-Methoden generieren, kann dies für Sie funktionieren.

19
Brian Scott

Ich hatte auch das gleiche Problem. Durch die Änderung meiner Kontextklasse zur Verwendung von IDbSet konnte ich das Gerüst erfolgreich zum Erstellen eines neuen Controllers verwenden. Da ich jedoch die asynchronen Methoden nicht aufgeben wollte, änderte ich den Kontext zurück, um DbSet zu verwenden, und das funktionierte für mich.

6
Gandyman

So habe ich dieses Problem gelöst. Ich habe Visual Studio 2013 Update 4.
Ich benutze EF Power Tools . Kommentieren Sie das gesamte DbSet <...> Aus. Innerhalb von OnModelCreating lassen Sie nur das Objekt, das Sie als Gerüst verwenden: modelBuilder.Configurations.Add (new SomeTableDataMap ());

Am Ende meiner Kontextklasse habe ich festgestellt, dass dies erstellt wurde: public System.Data.Entity.DbSet SomeTableDatas {get; einstellen; }

Oh: Ich habe dies auch in meinen Konstruktor eingefügt, aber es ist für etwas anderes. this.Configuration.LazyLoadingEnabled = false;

Im Ernst, das hat heute funktioniert, ich habe alle diese Lösungen ausprobiert, nichts hat für Update 4 funktioniert. Ich hatte dies in Update 2 und Update 3 unter Verwendung früherer Lösungen. Dies ist die aktuellste Lösung für jetzt.

3
Luke G

Einfache Problemumgehung, die für mich funktionierte (nachdem ich viele andere hier und an anderen Orten vorgeschlagene Lösungen ausprobiert hatte ...). 

Im Scaffolding-Dialog habe ich gerade einen neuen DataContext hinzugefügt, z. TempContext. Das gesamte Scaffolding funktionierte wie erwartet und dann konnte ich den generierten Code in TempContext einfach in meinen ursprünglichen DbContext verschieben und TempContext in den generierten Controllern in den ursprünglichen DbContext umbenennen.

2
Richard Houltz

Es gibt bereits mehrere Problemumgehungen für dieses Problem. In diesem Kommentar werde ich versuchen, das zugrunde liegende Problem darzustellen, warum dies möglicherweise fehlschlägt. [Mit der Hoffnung, die Menschen auf die eigentliche Ursache aufmerksam zu machen]

Nehmen wir an, Sie haben in Ihrer Anwendung eine DbContext-Klasse (um genau zu sein, eine untergeordnete Klasse von DbContext), und Sie versuchen, eine Modellklasse (beispielsweise Model) und die DbContext- und Scaffolding-Controller/-Ansichten zu verwenden. 

Ich vermute, dass DbContext nicht über die Eigenschaft "DbSet <Model> Models {get; set;}" verfügte. DbSet wurde jedoch mithilfe von Code in der OnModelCreating-Methode zum DbContext hinzugefügt.

Im obigen Fall versucht das Scaffolding zuerst, die DbSet-Eigenschaft in DbContext zu erkennen (nur durch Reflektion - damit nicht erkannt wird, ob OnModelCreating Code zum Hinzufügen des DbSet enthält). Wenn dies nicht der Fall ist, fügt Scaffolding dem DbContext eine DbSet-Eigenschaft hinzu und versucht es anschließend Gerüst mit diesem DbContext. Beim Ausführen des Gerüsts erstellen wir jedoch eine Instanz von DbContext und rufen auch OnModelCreating auf. An diesem Punkt schlägt das Gerüst fehl, da es mehrere DbSet-Typen mit demselben Modell im DbContext gibt (einer, der durch Gerüstbau hinzugefügt wird im Code in OnModelCreating konfiguriert).

[Dies gilt nicht nur für das verwendete Modell, sondern auch für verwandte Modelle in diesem Modell. Das Gerüst fügt DbSet-Eigenschaften für alle verwandten Modelle hinzu.]

[Außerdem sieht man die hinzugefügten DbSets nicht, nachdem das Gerüst fertig ist, weil das Gerüst alle Änderungen rückgängig macht, wenn die Operation nicht erfolgreich abgeschlossen wurde. Wie Jeff bereits erwähnte, war die Fehlermeldung anfangs schlecht und wurde verbessert, um dem Benutzer einen Hinweis zu geben aber es ist immer noch nicht super klar, was los ist]

Dies ist ein Fehler beim Scaffolding. Eine einfache Lösung wäre die Verwendung der DbSet-Eigenschaft in DbContext für alle verwandten Modelle Ihrer Modellklasse, anstatt sie in OnModelCreating zu konfigurieren.

1
pradeep

Keine der Antworten dieses Beitrags funktionierte für mich. Ich habe dieses Problem beim Erstellen einer neuen Kontextklasse über das Plus-Symbol im Dialogfeld "Controller hinzufügen" gelöst. Sobald VS Controller und Ansichten erstellt hat, entferne ich einfach die erstellte Kontextklasse und ändere den generierten Controller-Code, um meine vorhandene Kontextklasse zu verwenden.

Wichtig : Dieser Prozess fügt eine neue Verbindungszeichenfolge für den neuen Kontext hinzu. Vergessen Sie nicht, diese ebenfalls zu entfernen.

0
Luty

Ich habe das Problem gelöst, indem ich der OnModelCreating-Funktion innerhalb der Kontextklasse .. _ einen try/catch-Code hinzugefügt habe. base.OnModelCreating (modelBuilder); 

außerhalb deines try/catch

0
Anas Ghanem

meine wurde wie folgt repariert:

    public virtual DbSet<Category> Categories { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //--> EntityTypeConfiguration<Your Model Configuration>
        modelBuilder.Configurations.Add(new EntityTypeConfiguration<CategoryMapping>());  

        base.OnModelCreating(modelBuilder);
    }

Vergessen Sie nicht Strg + Umschalt + B, damit Ihr Code kompiliert wird (ich bin nicht sicher, ob eine Lösung vorhanden ist, aber da sich mein Projekt in einem anderen Projekt in derselben Lösung befindet, sollte es zuerst kompiliert werden)

0
deadManN

Keine der übrigen Antworten funktionierte für mich. Ich fand heraus, dass das Problem nur beim Scaffolding und Hinzufügen von Konfigurationen mit der Fluent-API auftrat. Also habe ich, anstatt getrennte Dateien zu haben, eine Entity-Konfiguration wie folgt:

public class ApplicationUserMapConfiguration : EntityTypeConfiguration<ApplicationUserMap>
{
    public ApplicationUserMapConfiguration()
    {
        ToTable("ApplicationUserMap", "Users");
        HasKey(c => c.Id);
     }
}

Und dann fügen Sie diese Konfiguration zum DbContext hinzu:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Configurations.Add(new ApplicationUserMapConfiguration()); 
}

Ich habe gerade die gesamte Konfiguration für jede Entität im DbContext hinzugefügt:

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

        //ApplicationUser

        modelBuilder.Entity<ApplicationUser>().HasKey(c => c.Id);
        modelBuilder.Entity<ApplicationUser>().ToTable("ApplicationUser", "Usuario");

        //Other entities...
    }

Jetzt kann ich perfekt rüsten. Ich habe bereits auf dem Mvc GitHub eingereicht und ausgegeben.

Auch wenn eine andere Fehlermeldung angezeigt wird: 

Beim Ausführen des ausgewählten Codegenerators ist ein Fehler aufgetreten: "Das Ziel eines Aufrufs hat eine Ausnahme ausgelöst."

Sie sollten Ihren DbContext-Konstruktor folgendermaßen ändern:

public YourDbContext() : base("YourDbContext", throwIfV1Schema: false) { }
0
Hernan Demczuk

Beim Versuch, einen Controller mit CRUD-Aktionen und -Sichten zu erstellen, wurde ein anderer Fehler angezeigt. In meinem Fall sagte es:

"Beim Ausführen des ausgewählten Codegenerators ist ein Fehler aufgetreten. Die Objektinstanz Wurde nicht auf eine Instanz des Objekts festgelegt."

Das Problem war schwer zu finden: Ich habe eine Tabelle in SQL Server erstellt, aber vergessen, den Primary Key für die Tabelle festzulegen. Durch das Festlegen von Primary key und die Aktualisierung der .edmx-Datei von Entity Framework wurde das Problem behoben.

Ich hoffe es hilft.

0