web-dev-qa-db-ja.com

Asp.Net 5(MVC 6)でEntity Framework 6.xを使用する方法

VS 2015 CTP-6を使用して、新しいAsp.Net 5をテストしています。 Entity Framework 7には機能がないため、今のところEF6を使用することをお勧めします。

次のように、EF7を削除してからPMでEF6を適用しようとしました。

Uninstall-Package EntityFramework
Install-Package EntityFramework -version 6.1.3

エラーは返されず、project.jsonファイルはそれに応じて更新されたようです。ただし、使用可能なDbContextはありません。

これはまったく可能ですか?はいの場合、ここからどのように進める必要がありますか? EF6との互換性のためにweb.configが必要ですか?

25
mikal

はい、これは正常に動作します。

コンテキストはweb.configから取得できないため、コンテキストの作成時に接続文字列を手動で設定する必要があります

あなたはこれを行うことができます

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

var context = new MyContext("myConnectionString");

config.jsonから接続文字列を取得する場合は、これを試してください

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

コンテキストをDIコンテナに注入したい場合は、このようなファクトリを追加しました

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

}

そして、これをstartup.csに追加しました

services.AddTransient<MyContext>((a) => MyContextFactory.GetContext());
17
Tom

使用するデータベースによっては、答えるほど簡単ではない場合があります。 MsSqlを使用している場合、構成は不要であり、受け入れられた答えはまったく問題ありません。ただし、LocalDBを使用するには設定が必要になる場合があります。

たとえば、MySqlはプロバイダーを登録する必要があります

[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は、entityFramework AND system.dataセクションにプロバイダーを登録する必要があります。これは、System.Data.Entity.DbConfiguration.Loadedイベント。 Oracleにも同じことが言えます。

詳細を説明するこのブログ投稿を確認してください: http://bleedingnedge.com/2015/11/01/entity-framework-6-with-asp-net-5/

6
pg0xC

Startup.csファイルでこれを行うだけではできませんか?ファクトリを作成して保存

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

RCバージョンでは、これは次のようになります。

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

開始する前に、Entity Framework 6は.NET Coreをサポートしていないため、project.jsonで完全な.NET Frameworkに対してコンパイルしてください。クロスプラットフォーム機能が必要な場合は、Entity Framework Coreにアップグレードする必要があります。

Project.jsonファイルで、完全な.NET Frameworkの単一のターゲットを指定します。

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

そして、接続文字列と依存性注入を設定します

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

ConfigureServices内のStartupクラスで、接続文字列を使用してコンテキストのファクトリメソッドを追加します。コンテキストをスコープごとに1回解決して、パフォーマンスを確保し、Entity Frameworkの信頼性の高い操作を確保する必要があります。

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

    // Configure remaining services
}

ntity Framework 6では、構成をxml(web.configまたはapp.config)またはコードで指定できます。 ASP.NET Coreでは、すべての構成はコードベースです。

コードベースの構成は、System.Data.Entity.Config.DbConfigurationのサブクラスを作成し、System.Data.Entity.DbConfigurationTypeAttributeDbContextサブクラスに適用することにより実現されます。

通常、設定ファイルは次のようになりました。

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

DefaultConnectionFactory要素は、接続のファクトリを設定します。この属性が設定されていない場合、デフォルト値はSqlConnectionProviderです。一方、値が指定されている場合、指定されたクラスを使用して、CreateConnectionメソッドでDbConnectionを作成します。指定されたファクトリにデフォルトのコンストラクタがない場合、オブジェクトを構築するために使用されるパラメータを追加する必要があります

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

この記事では、ASP.NET Coreアプリケーション内でEntity Framework 6を​​使用する方法を示します。https://docs.asp.net /en/latest/data/entity-framework-6.html

1
sosha