2017-04-06 4 views
0

この質問は何度か尋ねられましたが、私の解決策はまだありませんでした。DotNetコア、データベースプロバイダがこのDbContext用にコンフィグレーションされていません

私はDotNet Coreで非常に新しいです。 私の問題は、単純なlinqコマンドを使用して "Header"テーブルからデータを選択したいのですが、私は以下のエラーに直面しました。

追加情報: このDbContextに対してデータベースプロバイダが設定されていません。プロバイダーは、 DbContext.OnConfiguringメソッドをオーバーライドするか、 アプリケーションサービスプロバイダーでAddDbContextを使用して構成できます。 AddDbContextが使用されている場合は、 もDbContext型が のDbContextOptionsオブジェクトをコンストラクタとして受け入れ、DbContextの基本コンストラクタに渡していることを確認してください。

マイコンがあります。

public HeaderModel GetHeaderInformation() 
    { 
     using(var context = new ApplicationDbContext()) 
     { 
      var header = context.Headers.Select(x => new HeaderModel 
      { 
       colorCode = x.colorCode, 
       height = x.height, 
       Id = x.Id, 
       left = x.left, 
       top = x.top, 
       width = x.width 
      }).FirstOrDefault(); 

      return header; 
     } 
    } 

My ApplicationDbContextは、

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> //DbContext 
{ 
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) 
     : base(options) 
    { 
    } 

    public ApplicationDbContext() : base() 
    { 
    } 

    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     base.OnModelCreating(builder); 
     // Customize the ASP.NET Identity model and override the defaults if needed. 
     // For example, you can rename the ASP.NET Identity table names and more. 
     // Add your customizations after calling base.OnModelCreating(builder); 
    } 

    public DbSet<Header> Headers { get; set; } 
    public DbSet<Menu> Menus { get; set; } 
} 

私のstartup.csは、

 services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 
     services.AddApplicationInsightsTelemetry(Configuration); 
     services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders(); 
     services.AddMvc(); 

ありがとうございました。

答えて

6

依存性注入を使用しています。 services.AddDbContextはDbContextオブジェクトの作成を担当します。 ブロックを使用していることには意味がありません。これを行うと、接続文字列を持たない新しいApplicationDbContextをインスタンス化するためです。


このようなあなたの方法を書く:

public HeaderModel GetHeaderInformation(ApplicationDbContext context) 
{ 
    // the code inside your using block 
} 

と.NETは、依存性注入を経由してコンテキストを解決します。



さらに、一般的な方法は、あなたのコンストラクタクラスのプライベート読み取り専用atributeとしてDbContextを持つことです。だから、このようなことをしたいかもしれません:

public class MyConroller : Controller 
{ 
    private readonly MyDbContext _context; 

    public MyConroller(MyDbContext ctx) 
    { 
     _context = ctx; 
    } 
} 

あなたのメソッドでコンテキストの属性を使用してください。

+0

ご回答いただきありがとうございます。使用ブロックのdbContextを新規作成し、そのDbSet <>を使用してデータを選択、追加、削除します。あなたのソリューションは問題ありませんが、私の問題は解決しませんでした。 –

+0

コントローラではないクラスのコンストラクタにdbcontextを注入するにはどうすればよいですか? – zuckerthoben

+0

@zuckerthobenあなたはその質問[ここ](https://stackoverflow.com/questions/37189984/dependency-injection-with-classes-other-than-a-controller-class)の答えがあります:) – 5ar

0

パラメータレスコンストラクタは、DIによって新しいインスタンスが作成されたときに呼び出される可能性が高いため、削除する必要があります。私は、これが問題だった人々のために、それが助けてくれることを願っています。

関連する問題