2017-02-06 3 views
1

WebApiアクションを使用してEntity Frameworkを使用してアイテムを挿入しようとしています。コンテキストはアイテムが保存されたことを示すようですが、基になるデータベースにチェックインするとアイテムは保存されませんでした。WebApiコールでエンティティがデータベースに保存されない

public class HelpRequestController : ApiController 
{ 

    public HttpResponseMessage PostHelpRequest(HelpRequest item) 
    { 
     var context = new MyDbContext(); 
     try 
     { 
      using (var newcontext = new MyDbContext()) 
      { 
       newcontext.HelpRequests.Add(item); 
       newcontext.SaveChanges(); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message); 
     } 

     var response = Request.CreateResponse<HelpRequest>(HttpStatusCode.Created, item); 
     string uri = Url.Link("DefaultApi", new { id = 0 }); 
     response.Headers.Location = new Uri(uri); 
     return response; 
    } 

マイコンテキスト:

public class MyDbContext : DbContext 
{ 

    public DbSet<HelpRequest> HelpRequests { get; set; } 

} 

PostHelpRequestでHelpRequestパラメータが正しく解決され

ここ

はアクションである(それは郵便配達本体データに私が含まれたものと一致します)私の生成モデル:

public partial class HelpRequest 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Message { get; set; } 
    public System.DateTime CreateDate { get; set; } 
    public Nullable<bool> Responded { get; set; } 
} 

私は郵便配達を経由して、これをテストしていて、私の身体データを生、JSON

{"Title":"Title1","Message":"Message1","CreateDate":"2017-02-05T10:03:35.258"} 

に設定されているデータベース内のID列は、プライマリおよびアイデンティティとして設定されています。

編集:私は問題を発見した

が、それを解決する方法がわかりません。

コードをステップ実行してnewcontext.Database.ConnectionStringを見ると、SQLExpressデータベースを参照しています。プロジェクト用に作成されたようです。

しかし、モデルを開いて接続文字列を見ると、正しいサーバーとデータベースを参照しています。

なぜコンテキストに間違った接続文字列が割り当てられていますか?

編集:接続文字列とコンテキストコンストラクタ

<connectionStrings> 
    <add name="connname1" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=servername;initial catalog=mydatabase1;user id=andrewb;password=hahayeahright;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

コンストラクタ:

public MyDbContext() 
{ 
    Database.Log = sql => System.Diagnostics.Debug.Write(sql); 
} 

最終編集:解決策は、私は、接続文字列の名前と私のコンテキスト内でコンストラクタを設定する必要がありますということでした私は使いたい。イゴールの答えを見てください。

+1

SQL文のロギングを有効にしていますか?ログでINSERT文はどのように見えますか? –

+1

サイドノート: 'throw new Exception(ex.Message);を' throw 'に変更するか、 'catch'ブロック全体を削除します。 'throw;'はスタックトレースを元のExceptionに保存しますが、既存のステートメントはそれをリセットします。例外は例外がスローされた理由を把握しようとしています。 – Igor

+0

私は同意します、これは最初に動作するようになっていますが、例外がスローされないことを確認できます。 – andrewb

答えて

0

web.configセクションconnectionStringsを確認してください。理想的には、接続文字列の一意の名前を作成し、DbContextのコンストラクターでその名前を使用することをお勧めします。デフォルトのコンストラクタでその名前をDbContextのパラメータ化されたコンストラクタに渡すことはさらに簡単です。

MyDbContext.cs

public class MyDbContext : DbContext 
{ 
    public MyDbContext() : base("Name=bcard_portal") 

    public DbSet<HelpRequest> HelpRequests { get; set; } 
} 

web.configファイル

<connectionStrings> 
    <add name="bcard_portal" connectionString="data source=servername;initial catalog=mydatabase1;user id=andrewb;password=hahayeahright;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

サイドノート:あなたはDbContextで最初EF6とコードを使用している場合は、標準のADOを使用しています。web.configのNET db接続文字列ではなく、(古い)edmxデザイナーが使用する複雑なバージョンではありません。

関連する問題