1

私のWebプロジェクトでは、Entity Framework 6モデルの最初のアプローチを使用しようとしています。モデルは別のプロジェクトの既存のデータベースから生成されます。モデル生成の場合、接続文字列はデータアクセスプロジェクトのapp.configに保存されます。メインWebプロジェクト(ASP.NET Core MVC) 私はStartup.csクラスでコンテキスト作成を挿入しようとしています。モデル最初にEntity Framework 6でDbContextを作成

以下は、コンテキスト部分クラスのコードです。コンテキストはテンプレートから自動生成されるため、部分クラスが使用されます。それは私がSystem.Data.Entity.DbConfiguration

Configで
public class EntityFrameworkConfig : DbConfiguration 
{ 
    public EntityFrameworkConfig() 
    { 
     this.SetDefaultConnectionFactory(new SqlConnectionFactory()); 
     this.SetProviderServices(SqlProviderServices.ProviderInvariantName,  SqlProviderServices.Instance); 
    } 
} 

から継承されたコンフィギュレーションクラスを有するasp.netコアプロジェクトで使用することができない代わりに、App.configファイルのコードからエンティティ・フレームワークの構成を使用するため

[DbConfigurationType(typeof(EntityFrameworkConfig))] 
public partial class MyEntities 
{ 
    public MyEntities(String name) : base(name) 
    {  
    } 
} 

{ 
    "MailSettings": { 
    "ToAddress": "[email protected]" 
    }, 
    "Connection": { 
    "ConnectionString": "data source=SERVER;initial catalog=DB;user id=user;password=pwd;MultipleActiveResultSets=True;App=EntityFramework;" 
    } 
} 

Startup.csで:

Webプロジェクトでの.json私は、接続文字列を持っています
public void ConfigureServices(IServiceCollection services) 
{ 
    ... 

    String connStr = _config["Connection:ConnectionString"]; 
    services.AddScoped((_) => new MyEntities(connStr)); 
    ... 

}

私は、自動生成されたコンテキストクラスのOnModelCreatingイベントからスローUnintentionalCodeFirstExceptionを経験しています:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    throw new UnintentionalCodeFirstException(); 
} 

はasp.netコアMVCプロジェクトでEntity Frameworkの6モデルの最初のアプローチを使用するには、この適切な方法であり、この例外の理由は何ですか?

答えて

0

掘り後、私は、そのソリューションは、モデルのメタデータをロードするためにDbContextクラスを可能にするエンティティフレームワーク形式の接続文字列を提供することで発見。 Startup.csで

接続文字列が生成されたモデルエンティティフレームワークの検索に使用されるコードの最初のアプローチを発見したメタデータ情報が含まれていない形式で提供され、方法OnModelCreatingである理由つまりさ
String connStr = _config["Connection:ConnectionString"]; 
String efConnString = BuildConnectionString(connStr); 
services.AddScoped((_) => new MyEntities(efConnString)); 
.... 
.... 
private String BuildConnectionString(String cs) 
{ 
    EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 
    entityBuilder.Provider = "System.Data.SqlClient"; 
    entityBuilder.ProviderConnectionString = cs; 
    entityBuilder.Metadata = @"res://*/XXXWebModel.csdl| 
         res://*/XXXWebModel.ssdl| 
         res://*/XXXWebModel.msl"; 
    return entityBuilder.ToString(); 
} 

メタデータ情報は、問題を解決含むエンティティフレームワーク接続文字列としてフォーマットさ

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    throw new UnintentionalCodeFirstException(); 
} 

送信する接続文字列:例外をスローしていると呼ばれます。

2

これは、ASP.net CoreおよびEF 6で作業するときに従うべき手順です。これは単なる例です。ユースケースに合わせて変更する必要があります。

ステップ1:project.json

は、完全な.NET Frameworkの単一のターゲットを指定します。

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

ステップ2:セットアップ接続文字列と依存性注入

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

Startup.cs

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

    // Configure remaining services 
} 

ステップ3:移行構成設定からコードへ

Entity Frameworkの6構成が(web.configファイルまたはApp.configファイル内の)XMLまたはコードを指定することを可能にします。 ASP.NET Coreでは、すべての設定がコードベースです。その後

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

[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 and Entity Framework 6

+0

私はまったく同じことをしましたが、常にその例外が発生しました。違いは、パーサークラスを使用して自動生成されたコンテキストクラスを新しいコンストラクタで拡張して接続文字列を引数として渡すことができたことです。私のproject.jsonではnet462をフレームワークとして使用しています。 – srlle

+0

'' ' 'を正しく定義しましたか?あなたはそれを見せますか? – Sampath

+0

<パラメータ値= "mssqllocaldb" /> <プロバイダinvariantName =」 System.Data.SqlClient "type =" System.Data.Entity.SqlServer.SqlProviderServices、EntityFramework.SqlServer "/> これはweb.configで得られたもので、同じと思いますあなたが提案した設定。 – srlle

関連する問題