前回に引き続き今回は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';
コメント