2017-09-07 29 views
0

こんにちは私はDBに自分のデータを保存するのに問題があります。私はEF.net coreを使用しています。私は以下のサンプルコードを提供しています:値はnullにはできません。パラメータ名connectionString

ここで実際に何が間違っていますか?私はservices.AddDbContextConfigureServicesにMyContextとして提供しました。

public class MyContext: DbContext 
{ 
    private IConfigurationRoot _config; 

    public MyContext(IConfigurationRoot config) 
    { 
     this._config = config; 
    } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     base.OnConfiguring(optionsBuilder); 
     optionsBuilder.UseSqlServer(_config["Data:ConnectionString"]); 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     ... 
    } 
} 

appsettings.json

{ 
    "Data": { 
    "ConnectionString": "Data Source=MyDataSource;Initial Catalog=MyCatalog;Trusted_Connection=True"}, 

別のクラス:

public class AnotherClass 
{ 
    private MyContext mycontext; 
    private IConfigurationRoot configurationRoot; 

    public AnotherClass() 
    { 
     var builder = new ConfigurationBuilder(); 
     configurationRoot = builder.Build(); 
     mycontext = new MyContext(configurationRoot); 
    } 

    public MyMethod() 
    { 
     try 
     { 
      //object to be saved using EF 
      var saveObj = new SaveObj() 
      { 
      //pretend to have initialize some object here to save 
      }; 

      mycontext.SaveObj.Add(saveObj); 
      mycontext.SaveChanges(); 
     } 
     catch(Exception e) 
     { 
      //Throws an exception. Value cannot be null. Parameter name: connectionString 
     } 
    } 
} 

答えて

0

私はあなたがASP.NETコア1.1を使用していると仮定するつもりだ - 私は私を更新しますそうでない場合は答えてください。

あなたの主な問題は、新しいConfigurationBuilderを作成していて、実際にコンフィギュレーションソースを追加していないことです。あなたはASP.NETコア1.xのプロジェクトで見れば、あなたはの線に沿って何かわかります

new ConfigurationBuilder() 
    .SetBasePath(Directory.GetCurrentDirectory()) 
    .AddJsonFile("appsettings.json"); 

このコードスニペットでは、あなたはappsettings.jsonは、コンフィギュレーション・ソースとして追加されていることがわかります。ただし、ConfigurationBuilderにはこれがないため、appsettings.jsonの値は認識されません。両方のために

あなたはいくつかの変更が必要です、推奨されるアプローチに従って、具体的にあなたの問題を解決するために:ISMAの答え@に示すように、あなたのappsettings.jsonを再構築、

まず:

{ 
    "ConnectionStrings": { 
    "MyCatalogDatabase": "Data Source=MyDataSource;Initial Catalog=MyCatalog;Trusted_Connection=True" 
    } 
    ... 
} 

次に、ASP.NET Core 1.xプロジェクトの作成に標準テンプレートのいずれかを使用した場合、StartupコンストラクタはConfigurationプロパティを初期化します。 AddDbContextに接続文字列を提供するためにこれを使用します。

services.AddDbContext<MyContext>(opt => 
    opt.UseSqlServer(this.Configuration.GetConnectionString("MyCatalogDatabase"))); 

代わりにこれらの変更により、AnotherClassに注意を向けます。ここでは、依存性注入を通じてMyDbContextを取るコンストラクタを変更します。

public AnotherClass(MyContext myContext) 
{ 
    this.myContext = myContext; 
} 

また、configurationRootプロパティと対応するビルダーコードを削除します。

最後に、そのベースのコンストラクタにそれを通過、依存性注入を通じてDbContextOptionsを取るためにあなたのMyContextコンストラクタを更新:

public MyContext(DbContextOptions<MyContext> options) 
    : base(options) 
{ } 

をこの最後の変更により、あなたもMyContextから_configOnConfiguringを削除したいと思います。

あなたの質問に欠けているものは、AnotherClassのインスタンスをどのように作成するかの説明です。これを依存関係注入フレームワークにフックする必要があります。もし助けが必要な場合は、docsを参照するか、特定の質問がある場合はこのコメントにコメントしてください。

私が提供している解決策はこれを行う唯一の方法ではありませんが、主にASP.NET Coreドキュメント自体に基づいた私の個人的な推奨事項です。

+0

ありがとうございました。あなたのアプローチを試してみましょう。 – NewbeeNeedsHelp

+0

私のAnotherClassが私の他のクラスによってインスタンス化されています。他のクラスが別のコンストラクタを使用できないため、コンストラクタにMyContextを挿入できません – NewbeeNeedsHelp

+0

唯一のオプションは、インライン 'ConfigurationBuilder'を更新して、関連する設定ソースを直接追加することです。しかしこれはひどい考えです。私は強く*あなたが上から依存性注入システムを試してみることを勧めます。助けが必要な場合は、さらに多くのソースコードを質問に含めてください。または私たちはプライベートチャットに行くことができます... –

関連する問題