Comment utiliser le cadre D'entités 6.x en Asp.Net 5 (MVC 6)

je teste la nouvelle Asp.Net 5, en utilisant VS 2015 CTP-6. En raison du manque de fonctionnalités dans Entity Framework 7, je préférerais utiliser EF6 pour l'instant.

j'ai essayé de supprimer EF7 puis d'appliquer EF6 dans PM, comme ceci:

Uninstall-Package EntityFramework
Install-Package EntityFramework -version 6.1.3

pas d'erreurs retournées, et le projet.fichier json semble mis à jour en conséquence. Bien qu'il n'y ait pas de DbContext disponible.

Est-ce possible? Si oui, comment dois-je procéder à partir d'ici? Ai-je besoin d'un site web.config pour EF6 compatibilité?

25
demandé sur John Saunders 2015-03-27 11:18:19

5 réponses

Oui, cela fonctionne bien.

vous devez définir manuellement la chaîne de connexion lors de la création du contexte car il ne peut pas être obtenu à partir du web.config

de sorte que vous pouvez le faire

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

var context = new MyContext("myConnectionString");

si vous voulez obtenir la chaîne de connexion à partir de la config.json, puis essayez ce

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

et si vous voulez injecter le contexte dans le conteneur DI, alors j'ai ajouté une usine comme celle-ci

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

}

et a ensuite ajouté ceci dans démarrage.cs

services.AddTransient<MyContext>((a) => MyContextFactory.GetContext());
17
répondu Tom 2015-04-10 23:32:35

selon la base de données utilisée, il peut ne pas être aussi facile que répondu. Si vous utilisez MsSql alors aucune configuration n'est nécessaire et la réponse acceptée est parfaitement correcte. Mais à l'aide de LocalDB peut-être besoin un peu de configuration.

Par exemple MySql besoin de s'inscrire fournisseur

[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 il faut inscrire le fournisseur dans le cadre et le système d'entité.section de données. Cela peut être fait en utilisant System.Data.Entity.DbConfiguration.Loaded événement. En va de même avec Oracle.

voir ce billet de blog cela explique cela en détail:http://bleedingnedge.com/2015/11/01/entity-framework-6-with-asp-net-5/

6
répondu pg0xC 2015-11-09 16:41:21

Pouvez-vous pas juste le faire dans le démarrage.fichier cs? Enregistrer la création d'une usine

// new context on each request
services.AddScoped<IMyContext, MyContext>((s) =>
{
    return new MyContext(Configuration["Data:MyConnection:ConnectionString"]);
});
5
répondu Gillardo 2016-02-04 17:34:43

avec la version RC, cela devient:

        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddEnvironmentVariables();
        var Configuration = builder.Build();
        var connectionString = Configuration["Data:DefaultConnection:ConnectionString"];
3
répondu kenstone 2015-11-20 19:01:48

avant de commencer, assurez-vous que vous compilez avec le Framework .net complet dans votre project.json as Entity Framework 6 ne supporte pas .NET Core. Si vous avez besoin de fonctionnalités multiplateformes, vous devrez passer à Entity Framework Core.

Dans votre projet.le fichier json spécifie une cible unique pour le Framework .NET complet:

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

et ensuite configurer les chaînes de connexion et l'injection de dépendances

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

dans la classe de démarrage dans ConfigureServices ajoutez la méthode factory de votre contexte avec sa chaîne de connexion. Le contexte devrait être résolu une fois par portée afin d'assurer le rendement et le fonctionnement fiable du cadre de L'entité.

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

    // Configure remaining services
}

ntity Framework 6 permet de spécifier la configuration en xml (en web.config ou app.la configuration) ou à l'aide de code. En date du ASP.NET Core, toute la configuration est basée sur le code.

la configuration basée sur le Code est obtenue en créant une sous-classe de System.Data.Entity.Config.DbConfiguration et en appliquant System.Data.Entity.DbConfigurationTypeAttribute pour votre DbContext sous-classe.

notre fichier de configuration ressemblait typiquement à ceci:

<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'élément defaultConnectionFactory définit l'usine pour les connexions. Si cet attribut n'est pas défini, la valeur par défaut est SqlConnection Provider. Si, d'autre part, la valeur n'est fournie, la classe sera utilisée pour créer des DbConnection avec sa CreateConnection méthode. Si l'usine n'a pas de défaut constructeur ensuite, vous devez ajouter les paramètres qui sont utilisés pour construire l'objet

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

cet article vous montrera comment utiliser Entity Framework 6 à l'intérieur d'un ASP.NET application de base. https://docs.asp.net/en/latest/data/entity-framework-6.html

1
répondu sosha 2016-08-13 07:26:00