EFCoreのオプティミスティック同時実行制御を有効にするために、rowversionを追加する

前提条件

EFCoreのオプティミスティック同時実行制御を有効にするために、テーブルにrowversionが必要になる。
DB Firstでの業の場合、スキャフォールドでのリバースエンジニアリングが必要になる。

今回やりたいこと

Not NullなRevision カラムをAlter Tableにて追加を行う。

SQL Command(rowversionを後から追加したい場合はこちらのcommand)

ALTER TABLE [ tableName ] ADD Revision rowversion NOT NULL;

EDMとDbContextのリバースエンジニアリング

Revision カラムを追加した状態でScaffold-DbContext commandを実行すること

SQLServerのContainer Imageを更新する

特にCIを回している場合は、同期が必要なため注意すること

SQLServerのContainerを起動を待機するgithub Actionsを書く

CIを回す際に永続化レイヤーが欲しくなる問題

業務アプリケーションのServiceやエンドポイントを開発していると、Testの実行時に実際の永続化レイヤーへの接続が欲しくなる。

github.com

name: .NET CI

on:
  pull_request:

jobs:
  build:
    runs-on: ubuntu-latest

    services:
      mssql-kashilog:
        image: ghcr.io/creatiovitae/kashilogdb:2023-11.14
        ports:
          - 1433/tcp
          - 1433:1433
        options: >-
          --health-cmd "/opt/mssql-tools/bin/sqlcmd -U SA -P h0geFuga -Q 'select 1' -b -o /dev/null"
          --health-interval 60s
          --health-timeout 30s
          --health-start-period 20s
          --health-retries 3
    steps:
    - uses: actions/checkout@v4
    - name: Setup .NET
      uses: actions/setup-dotnet@v3
      with:
        dotnet-version: '8.0.x'
    - name: Restore dependencies
      run: dotnet restore
    - name: Build
      run: dotnet build --configuration Release --no-restore
    - name: Test
      run: dotnet test --no-restore --verbosity normal
      env:
        TEST_ENVIRONMENT: Ci

ポイント

  • Container Imageは例によって ghcr.io/creatiovitae/kashilogdb を利用する。
  • Ports1433/tcpを設定する
  • health-cmd"/opt/mssql-tools/bin/sqlcmd -U SA -P h0geFuga -Q 'select 1' -b -o /dev/null" を設定する。今回はCi用の漏れても特に影響のない情報なのでId/passwordを決め打ちにしているが、用途によってはsecretを挿すようにしたほうがいいかもしれない。

外向きの静的 IP アドレスを設定しない状態で、.NET8でHttpRequestを送るための改善を行いたい

前提条件

  • ASP.NET Core 8 環境
  • Google CloudのCloud Run等で外向きの静的 IP アドレスを設定しない状態(IPが固定できている場合には問題は起こらない。)

発生する現象

System.Net.NetworkInformation.NetworkInformationException (13): Permission denied が発生する時がある。(起きない時もある。)

対処方法

  • HTTP/3( Alt-Svc 処理)を無効にする
    • DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORTfalseに設定する。
    • AppContext.SetSwitchで、System.Net.SocketsHttpHandler.Http3Supportを設定する。

関連Issue

github.com

RouteHandlerAnalyzer が InvalidOperationException をスローする に対する対処を行う

事前条件

.NET8 projectである

現象

Analyzerの警告でタイトルのエラーが出力される。

対処方法

<PropertyGroup>
  <NoWarn>$(NoWarn);AD0001</NoWarn>
</PropertyGroup>

を、設定する。

関連Issue

github.com

github の Container RegistryにimageのPushを行う

github の Container RegistryにimageのPushを行い、Pullを行う

事前条件

環境変数:CR_PATpersonal access tokenを設定して、docker loginが済であること

イメージをpushする(kashilogdbをsampleに使う。)

docker tag kashilogdb ghcr.io/creatiovitae/kashilogdb:2023-11.14

docker push ghcr.io/creatiovitae/kashilogdb:2023-11.14

イメージをpullする(kashilogdbをsampleに使う。)

docker pull ghcr.io/creatiovitae/kashilogdb:2023-11.14

docker run --name kashilogdb -d -p 15331:1433 ghcr.io/creatiovitae/kashilogdb:2023-11.14

WindowsでgithubのContainer Registryにログインする

事前条件

Windows のpower shellでの場合を記述している。
prompt等の場合、環境変数の設定は、set キーワードを利用するため、注意すること。

personal access token(classic)を作成する

開発者設定から作成を行う。

power shellで操作を行う

環境変数を設定する

$Env:CR_PAT = "<personal access token>"

<personal access token> には、作成した personal access token(classic)を設定すること

docker login ghcr.io を発行する

echo $Env:CR_PAT | docker login ghcr.io -u username --password-stdin

usernamegithubのユーザー名を設定すること。
この時環境変数がうまく設定できていない場合、
Error: Cannot perform an interactive login from a non TTY device というerrorが発生する。

githubの開発者設定を開く

githubの開発者設定を開く業をよく忘れるのでメモっていく

事前条件

github.comにログイン状態であること github.com

SettingからDeveloper Settingsを開く

〇settingsは以下 github.com

〇Developer Settingsは以下 github.com

開発者設定 is 何

github アプリを開発したい場合や、Apiを利用したい場合のTokenの登録を行う際にお世話になる。
大多数の人はTokenの登録業を行うことになる。