2015-03-27 16 views
25

Sto testando il nuovo Asp.Net 5, utilizzando VS 2015 CTP-6. A causa della mancanza di funzionalità in Entity Framework 7, preferirei utilizzare l'EF6 per ora.Come utilizzare Entity Framework 6.x in Asp.Net 5 (MVC 6)

Ho provato a rimuovere EF7 e poi applicare EF6 in PM, in questo modo:

Uninstall-Package EntityFramework 
Install-Package EntityFramework -version 6.1.3 

Nessun errore restituiti, e il file project.json sembra aggiornato di conseguenza. Sebbene, non ci siano DbContext disponibili.

È possibile? Se sì, come dovrei procedere da qui? Ho bisogno di web.config per la compatibilità con EF6?

risposta

17

Sì, questo funziona correttamente.

È necessario impostare manualmente la stringa di connessione quando si crea il contesto in quanto non può ottenere dal web.config

in modo da poter fare questo

public class MyContext : DbContext { 
    public MyContext(string connectionString) : base(connectionString) { 
    } 
} 

var context = new MyContext("myConnectionString"); 

se si desidera ottenere il stringa di connessione dal config.json, quindi provare questo

IConfiguration configuration = new Configuration().AddJsonFile("config.json"); 
var connectionString = configuration["Data:DefaultConnection:ConnectionString"]); 

e se si vuole iniettare il contesto nel dI Container, poi ho aggiunto una fabbrica come questo

public static class MyContextFactory 
{ 
    public static MyContext GetContext() { 
     IConfiguration configuration = new Configuration().AddJsonFile("config.json"); 
     return new MyContext(configuration["Data:DefaultConnection:ConnectionString"]); 
    } 

} 

e poi aggiunte questo in startup.cs

services.AddTransient<MyContext>((a) => MyContextFactory.GetContext()); 
+0

È necessario includere ancora System.Data nel progetto? Andrebbe anche nelle dipendenze? – Yashvit

+0

non è necessario impostare le dipendenze, ma poiché EF 6 non è supportato da .net core, è necessario assicurarsi che il framework faccia riferimento a "dnx451" anziché a "dotnet" nel project.son. –

+0

Come risposta da kenstone, ConfigurationBuilder dovrebbe essere usato nell'RC, invece di Configurazione. http://stackoverflow.com/a/33834167/3805983 –

5

puoi non solo fare questo nel startup.cs il file? Salvare la creazione di uno stabilimento

// new context on each request 
services.AddScoped<IMyContext, MyContext>((s) => 
{ 
    return new MyContext(Configuration["Data:MyConnection:ConnectionString"]); 
}); 
+1

o anche in 1 riga: services.AddScoped (s => new MyContext (Configuration ["Data: MyConnection : ConnectionString "])); – rfcdejong

6

A seconda del database utilizzato, potrebbe non essere semplice come rispondere. Se si utilizza MsSql, non è necessaria alcuna configurazione e la risposta accettata è perfettamente soddisfacente. Ma l'utilizzo di LocalDB potrebbe richiedere qualche configurazione.

Per esempio MySql ha la necessità di registrarsi fornitore

[DbConfigurationType(typeof(CodeConfig))] // point to the class that inherit from DbConfiguration 
public class ApplicationDbContext : DbContext 
{ 
    [...] 
} 

public class CodeConfig : DbConfiguration 
{ 
    public CodeConfig() 
    { 
     SetDefaultConnectionFactory(new MySql.Data.Entity.MySqlConnectionFactory()); 
     SetProviderServices("MySql.Data.MySqlClient", 
        new MySql.Data.MySqlClient.MySqlProviderServices()); 
    } 
} 

PostgreSql necessità di registrare fornitore in EntityFramework e la sezione system.data. Questo può essere fatto usando l'evento System.Data.Entity.DbConfiguration.Loaded. Lo stesso vale per Oracle.

Controllare questo post sul blog che spiega in dettaglio: http://bleedingnedge.com/2015/11/01/entity-framework-6-with-asp-net-5/

+2

Avevo un * "Impossibile determinare il nome del provider per la factory provider di tipo 'MySql.Data.MySqlClient.MySqlClientFactory'. Assicurarsi che il provider ADO.NET sia installato o registrato nella configurazione dell'applicazione." * Eccezione con ** MySQL **. Per farlo funzionare ho aggiunto più impostazioni nella classe * DbConfiguration *: 'SetProviderFactory (" MySql.Data.MySqlClient ", nuovo MySql.Data.MySqlClient.MySqlClientFactory()); SetProviderFactoryResolver (new MySql.Data.Entity.MySqlProviderFactoryResolver()); ' –

3

Con la versione RC, questo diventa:

 var builder = new ConfigurationBuilder() 
      .AddJsonFile("appsettings.json") 
      .AddEnvironmentVariables(); 
     var Configuration = builder.Build(); 
     var connectionString = Configuration["Data:DefaultConnection:ConnectionString"]; 
1

Prima di iniziare, assicurarsi che si compila contro completo .NET Framework nel vostro project.json come Entity Framework 6 non supporta .NET Core. Se sono necessarie funzionalità multipiattaforma, è necessario eseguire l'aggiornamento a Entity Framework Core.

Nel file project.json specificare un singolo target per l'intero.NET Framework:

"frameworks": { 
    "net46": {} 
} 

e poi stringhe di connessione configurazione e l'iniezione di dipendenza

public class ApplicationDbContext : DbContext 
{ 
    public ApplicationDbContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
    } 
} 

Nella classe di avvio entro ConfigureServices aggiungono metodo factory del contesto con la sua stringa di connessione. Il contesto dovrebbe essere risolto una volta per ambito per garantire le prestazioni e garantire un funzionamento affidabile di Entity Framework.

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddScoped((_) => new ApplicationDbContext(Configuration["Data:DefaultConnection:ConnectionString"])); 

    // Configure remaining services 
} 

ntity Framework 6 permette la configurazione da specificare in XML (in web.config o app.config) oppure tramite il codice. A partire da ASP.NET Core, tutta la configurazione è basata su codice.

configurazione Codice-base è realizzato mediante la creazione di una sottoclasse di System.Data.Entity.Config.DbConfiguration e applicando System.Data.Entity.DbConfigurationTypeAttribute al DbContext sottoclasse.

Il nostro file di configurazione in genere si presentava così:

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
      <parameter value="mssqllocaldb" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
</entityFramework> 

L'elemento defaultConnectionFactory imposta la fabbrica per le connessioni. Se questo attributo non è impostato, il valore predefinito è SqlConnectionProvider. Se, al contrario, viene fornito un valore, la classe data verrà utilizzata per creare DbConnection con il suo metodo CreateConnection. Se la data fabbrica ha alcun costruttore di default, allora è necessario aggiungere i parametri che vengono utilizzati per costruire l'oggetto

[DbConfigurationType(typeof(CodeConfig))] // point to the class that inherit from DbConfiguration 
public class ApplicationDbContext : DbContext 
{ 
    [...] 
} 

public class CodeConfig : DbConfiguration 
{ 
    public CodeConfig() 
    { 
     SetProviderServices("System.Data.SqlClient", 
      System.Data.Entity.SqlServer.SqlProviderServices.Instance); 
    } 
} 

In questo articolo vi mostrerà come utilizzare Entity Framework 6 all'interno di un'applicazione ASP.NET core. https://docs.asp.net/en/latest/data/entity-framework-6.html

Problemi correlati