以前に作成した、「ASP.NET」と「OpenLayers」から、.Net 8で動くよう、
「ASP.NET Core」と「OpenLayers」を利用して、WebGISを検証中でして、
その際の、「ASP.NET Core」から「EntityFrameworkCore」を使用する際のメモです。
各処理とファイルは以下の通りです。
1.データベースモデルの作成
2.データベースコンテキストの設定
3.データベース接続文字列の設定
4.Program.csの設定
5.コントローラーの実装
6.SqlNullValueExceptionの無効化
1.データベースモデルの作成
データベースモデルの作成は、「EntityFrameworkCore」の場合と全く変更はありません。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[Serializable] [Table("t_layer")] public class LayerEntity { [DisplayName("レイヤID"), Key, Column("layer_id", Order = 0), DatabaseGenerated(DatabaseGeneratedOption.None)] public string LayerId { get; set; } = string.Empty; [DisplayName("レイヤ名"), Column("layer_name")] public string LayerName { get; set; } = string.Empty; [DisplayName("レイヤ種別"), Column("layer_type")] public string LayerType { get; set; } = string.Empty; } } |
2.データベースコンテキストの設定
こちらも、「EntityFrameworkCore」の場合と全く変更はありません。
|
1 2 3 4 5 6 7 8 9 |
public class MapDbContext : DbContext { public MapDbContext(DbContextOptions options) : base(options) { } public DbSet Layers { get; set; } } |
3.データベース接続文字列の設定
データベース接続文字列は、web.configから、appsettings.jsonファイルに変わったので、接続文字列を追加します。
接続文字列では、MS SQL Serverのサーバ証明書のチェーンを検証しないので、trustServerCertificate=trueを追記します。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "ConnectionStrings": { "DefaultConnection": "Server=SERVER_NAME\\SQLEXPRESS;Database=MAP_DB;User ID=userid;Password=userpass;TrustServerCertificate=True;" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" } |
4.Program.csの設定
ASP.NET Core 5.0以降なので、Program.csに「EntityFrameworkCore」の設定を追加します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
{ var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // EntityFrameworkCoreの設定を追加 builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run(); } |
5.コントローラーの実装
Controllersフォルダーに新しいコントローラーを作成し、データベース操作を実装します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[Route("[controller]")] [ApiController] public class LayerTreeController : ControllerBase { private readonly MapDbContext _context; public LayerTreeController(MapDbContext context) { _context = context; } [HttpGet("GetTree")] public ActionResult<List> GetTree() { var layers = _context.Layers; return layers.ToList(); } } |
6.SqlNullValueExceptionの無効化
1~5の実装で動作確認したところ、データ取得時に例外が発生しました、.Net8よりNullチェック
が厳格され、テーブルとEntityクラスの不一致により例外が発生するようになりました。
データベースやクラスに型と統一すれば対応できますが、変更したくなかったため、
.cprojファイルのNullチェックを一旦無効にしました。
|
1 2 3 4 5 6 7 8 9 |
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <Nullable>disable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> </Project> |