Entity Framework 7 nessun provider di database è configurato => quando le migrazioni vengono spostate su un altro progetto

asp.net-core c# entity-framework-core

Domanda

Sono nuovo di EF7. So che questa è una domanda doppia per:

Nessun provider di database è configurato EF7

Ma aspetta prima di voler chiudere questa domanda ... e continua a leggere

 services.AddEntityFramework()
         .AddSqlServer()
         .AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

 services.AddIdentity<ApplicationUser, IdentityRole>()
         .AddEntityFrameworkStores<ApplicationDbContext>()
         .AddDefaultTokenProviders();

  services.AddScoped<TestRepository, TestRepository>();

Ora eseguo il comando di aggiornamento del database dnx ef sulle finestre cmd nel mio progetto EF e ottengo questo errore:

 services.AddEntityFramework()
         .AddSqlServer()
         .AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

 services.AddIdentity<ApplicationUser, IdentityRole>()
         .AddEntityFrameworkStores<ApplicationDbContext>()
         .AddDefaultTokenProviders();

  services.AddScoped<TestRepository, TestRepository>();

Ora ho provato a cambiare il costruttore del mio ApplicationDbContext base al link della soluzione che ho incollato in alto:

Questo è il mio codice:

My ApplicationDbContext.cs è effettivamente vuoto, il che significa che non ho sovrascritto.

Guardando la classe base della classe base c'è il costruttore sovraccarico con parametro DbContextOptions ma non posso passare nulla dal mio costruttore ?!

 services.AddEntityFramework()
         .AddSqlServer()
         .AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

 services.AddIdentity<ApplicationUser, IdentityRole>()
         .AddEntityFrameworkStores<ApplicationDbContext>()
         .AddDefaultTokenProviders();

  services.AddScoped<TestRepository, TestRepository>();

Cosa è rotto dalla mia parte? Sto usando EF 7 RC1 e dnx 451.

Ciò si verifica solo quando si sposta ApplicationDbContext / ApplicationUser e l'intera cartella Migrations su un extra consente di dire progetto "DataAccess". Quindi tutto sembra rotto.

Risposta accettata

  1. Creare una nuova applicazione Web ASP.NET denominata "WebProject" utilizzando il modello di applicazione Web (autenticazione: account utente individuale).

  2. Ora aggiungi un altro progetto alla soluzione denominata "DataAccess" (diciamo che il tipo di libreria di classi non è rilevante)

  3. Ora sposta la cartella ApplicationDbContext / ApplicationUser e migrazioni nel progetto DataAccess.

  4. In questa fase la compilazione fallirà, quindi è necessario correggere project.json per riferimenti corretti.

  5. Per il progetto DataAccess, aggiungere le seguenti dipendenze

    "dependencies": {
        "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
        "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final"
    }
    
  6. Per WebProject, aggiungere DataAccess come dipendenza. Poiché DataAccess ha riferimento a più di 2 pacchetti, è possibile rimuovere tali riferimenti da WebProject.
    La compilazione dovrebbe avere successo ora e puoi avviare l'applicazione web.

Come utilizzare le migrazioni di ef:

Nella riga di comando, vai alla directory di WebProject (e non al progetto DataAccess). Tutti i comandi ef funzioneranno bene da qui.

Per aggiungere nuove migrazioni alla cartella Migrazioni del progetto DataAccess, è necessario utilizzare flag -p . Piace,
dnx ef migrations add Sample -p DataAccess .

Il problema sorge perché i comandi vengono eseguiti da cmd all'interno del progetto DataAccess. La tua classe di avvio che sta inizializzando tutti i servizi è in WebProject. Quando si tenta di eseguire comandi dalla directory DataAccess, dnx ef verrà riconosciuto dal EntityFramework.Commands fa riferimento a EntityFramework.Commands ma quando si tenta di utilizzare le migrazioni, i servizi non vengono inizializzati, pertanto non riuscirà a generare eccezioni.


Risposta popolare

Prova a spostare la classe Context nel progetto "DataAccess" e sostituisci il metodo OnConfiguring del tuo contesto nel progetto "DataAccess", quindi esegui la migrazione.

public partial class MyContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options.UseSqlServer(@"Server=****;Database=***;user id=***;password=***");
    }
}

Oppure si può fare come segue se non si desidera codificare la stringa di connessione. DI inietterà le opzioni per te;

public partial class MyContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options.UseSqlServer(@"Server=****;Database=***;user id=***;password=***");
    }
}

e sul tuo Startup.cs;

public partial class MyContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options.UseSqlServer(@"Server=****;Database=***;user id=***;password=***");
    }
}

e il tuo appsetting.json;

public partial class MyContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options.UseSqlServer(@"Server=****;Database=***;user id=***;password=***");
    }
}



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché