c# - Il controller di Scaffolding non funziona con gli aggiornamenti 3 e 4 di Visual Studio 2013



5 Answers

Ho avuto questo problema anche io. La soluzione di Jeff funziona in alcuni casi. Ma mentre il mio DbContext cresceva con più modelli con chiavi che dovevano essere mappate, non potevo cancellare i metodi Configurations.Add () perché avrei quindi ricevuto degli errori che EF non riusciva a trovare le chiavi primarie, ecc ...

Ho scoperto che cambiando la mia classe derivata DBContext per usare le proprietà IDbSet invece di DbSet, potevo generare i controller e le viste bene. Tuttavia, per me questo ha introdotto un altro problema, IDbSet non supporta i metodi asincroni.

Sembra che sia possibile generare controller non asincroni con configurazioni in atto o metodi asincroni senza classi di configurazione.

Se le proprietà del contesto sono di tipo DbSet, provare a cambiarle in IDbSet. Se non stai generando metodi di controller asincrono questo potrebbe funzionare per te.

c# entity-framework visual-studio

Non riesco a impacchettare un controller (controller MVC5 con viste, utilizzando Entity Framework) in Visual Studio 2013 (aggiornamento 3 e 4). Il messaggio di errore è qui sotto:

Si è verificato un errore durante l'esecuzione del generatore di codice selezionato:

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

Ho creato i modelli selezionando 'Reverse Engineer Code First' dal menu Tool 'Entity Framework Power Tools Beta 4'.

Qualche idea su cosa potrebbe causare questo errore?




Ecco come ho risolto questo problema. Ho Visual Studio 2013 Update 4.
Io uso EF Power Tools. Commenta tutto il DbSet <...> All'interno di OnModelCreating, lascia l'oggetto che stai impalcando: modelBuilder.Configurations.Add (new SomeTableDataMap ());

Nella parte inferiore della mia classe di contesto ho notato che questo è stato creato: public System.Data.Entity.DbSet SomeTableDatas {get; impostato; }

Oh: lo metto anche nel mio costruttore ma è per qualcos'altro, this.Configuration.LazyLoadingEnabled = false;

Seriamente, questo ha funzionato oggi, ho provato tutte queste soluzioni per l'Update 4 non funzionava. Ho avuto questo lavoro in Update 2 e Update 3 usando le soluzioni precedenti. Questa è la soluzione più aggiornata per ora.




Esistono già più soluzioni alternative per questo problema. E in questo commento, cercherò di fornire il problema sottostante perché questo potrebbe fallire. [Con la speranza di rendere le persone consapevoli della causa principale]

Diciamo che hai un DbContext (per essere specifico, classe figlio di DbContext) nella tua applicazione, e stai provando ad usare una classe modello (diciamo Modello) e i controller / viste DbContext e scaffolding.

Immagino che DbContext non abbia una proprietà "DbSet <Model> Models {get; set;}" ma il DbSet è stato comunque aggiunto a DbContext usando il codice nel metodo OnModelCreating.

Nel caso precedente, lo scaffolding tenta prima di rilevare la proprietà DbSet su DbContext (solo per riflessione - in modo che non rilevi se OnModelCreating ha il codice per aggiungere il DbSet) e dato che non lo è, lo scaffold aggiunge una proprietà DbSet a DbContext e quindi prova a impalcatura che utilizza DbContext, tuttavia quando si esegue lo scaffolding, creiamo un'istanza di DbContext e chiamiamo anche OnModelCreating e, a quel punto, l'impalcatura fallisce perché ci sono più tipi di DbSet con lo stesso modello in DbContext (uno aggiunto da scaffolding e uno configurato nel codice in OnModelCreating).

[Questo accade non solo per il modello in uso, ma anche per i modelli correlati in quel modello, l'impalcatura aggiunge proprietà DbSet per tutti i modelli correlati]

[Inoltre, non si vede il DbSet aggiunto dopo che l'impalcatura è stata eseguita perché l'impalcatura ripristina le eventuali modifiche se l'operazione non è stata completata correttamente, come Jeff ha detto, inizialmente il messaggio di errore era scarso ed è stato migliorato per dare qualche suggerimento all'utente ma non è ancora chiaro cosa sta succedendo]

Si tratta di un bug nello scaffolding, una semplice soluzione sarebbe utilizzare la proprietà DbSet su DbContext per tutti i modelli correlati della classe del modello anziché configurarli in OnModelCreating.




Nessuna delle altre risposte ha funzionato per me. Quello che ho scoperto è che il problema si è verificato solo durante lo scaffolding e l'aggiunta di configurazioni utilizzando l'API Fluent. Quindi quello che ho fatto è stato, invece di avere file separati, ognuno con una configurazione di entità come questa:

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

E quindi aggiungere questa configurazione a DbContext:

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

Ho appena aggiunto l'intera configurazione all'interno di DbContext per ogni entità:

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

Ora posso impalcarli perfettamente. Ho già inviato e pubblicato sul GitHub Mvc .

Inoltre, se un altro messaggio di errore si alza dicendo:

Si è verificato un errore durante l'esecuzione del generatore di codice selezionato: "L'eccezione di una chiamata è stata lanciata dall'obiettivo di una chiamata".

È necessario modificare il costruttore DbContext in:

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



il mio è stato risolto in questo modo:

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

Non dimenticare Ctrl + Maiusc + B in modo da compilare il codice (non sono sicuro per la soluzione singola, ma poiché il mio è in un altro progetto nella stessa soluzione, dovrebbe essere compilato prima)






Related