[C#]Entity Frameworkでデータを追加する(insert)

C#

前回に引き続き今回はinsertを試してみます。

確認環境
sqlserver2019(docker)
・Azure Functions(.Net Core 2.1)
・NuGetライブラリ
=> Microsoft.EntityFrameworkCore 2.2.6
=> Microsoft.EntityFrameworkCore.Design 2.2.6
=> Microsoft.EntityFrameworkCore.SqlServer 2.2.6
=> Microsoft.Net.Sdk.Functions 1.0.31

リクエストするデータを用意

今回は前回のSelectのテストで使った、Boardテーブルに向けてインサートします。
データはjson形式で投げて登録するようにします。

リクエストとして下記のjsonを用意しました。

{
    Title: "タイトル",
    UserName: "テスト太郎",
    AboutText: "概要テキスト",
    Password: "パスワード",
}

サンプルコード

[FunctionName("EntityFrameworkTestController_Insert")]
public static async System.Threading.Tasks.Task<IActionResult> InsertAsync(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = "efcore_test_insert")] HttpRequest req,
    ILogger log)
{
    log.LogInformation("start EntityFrameworkTestController_Insert");

    // jsonリクエストを取得
    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);

    // jsonリクエストで掲示板登録
    using (var _dbContext = new DBContextFactory().CreateDbContext())
    {
        var board = new Board
        {
            Title = data?.Title,
            UserName = data?.UserName,
            AboutText = data?.AboutText,
            Password = data?.Password
        };

        _dbContext.Boards.Add(board);
        _dbContext.SaveChanges();
    }

    return new OkResult();
}

やっていること

このファンクションにjson形式でリクエストをPOSTで投げて、アクセスされることを想定しています。
最初にStreamReaderとJsonConvert.DeserializeObjectを使って、jsonからデータを取ってきます。

それをdataという変数に格納して、
Boardのモデルを新規に作って、当て込んでいます。

その後に下記のように書いて、登録処理をしています。

DbContext.[dbSetのモデル名].Add([追加するためにnewしたモデル]);
DbContext.SaveChanges();

動作確認

postmanという、apiにアクセスして実行テストするのに便利なツールがあるので
postmanを使って動かしました。

apiテストとかする人は便利だから入れておくことをオススメします👏🏻

テーブルにデータが登録できていることを確認できました。

エラーが出た

インサートしようとした時に下記のエラーが出ました。
idがnullなのでインサートができないとのこと・・・

あれ?オートインクリメントしてたはず。。
と思って、もう一度マイグレーションでテーブルを作り直したらできるようになりました😩

[2020/02/10 14:10:33] Executed 'EntityFrameworkTestController_Insert' (Failed, Id=2042c349-71d4-4f8d-af17-da5feb6de50f)
[2020/02/10 14:10:33] System.Private.CoreLib: Exception while executing function: EntityFrameworkTestController_Insert. 
Microsoft.EntityFrameworkCore.Relational: An error occurred while updating the entries. See the inner exception for details. 
Core .Net SqlClient Data Provider: Cannot insert the value NULL into column 'id', table 'test01.dbo.boards'; 

コメント

タイトルとURLをコピーしました