Grow up

生活とプログラミング

Setup DB First JetEntityFrameworkProvider in VS2019

f:id:knkomko:20201025011901p:plain

準備① JetEntityFrameworkProvider

GitHubからソースコードをダウンロードします。
f:id:knkomko:20201022004851p:plain

準備② レジストリのバックアップ

今回は VisualStudio のレジストリをエクスポートしました。
必要に応じて他のレジストリもエクスポートしておくと安心です。

regedit を実行。
f:id:knkomko:20201022005849p:plain

VisualStudio を選択。
コンピューター\HKEY_CURRENT_USER\Software\Microsoft\VisualStudio
f:id:knkomko:20201022010036p:plain

エクスポートで保存。
f:id:knkomko:20201022010202p:plain

準備③ レジストリキー作成

レジストリエディタからVisualStudioにキーを新規作成します。
コンピューター\HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\
f:id:knkomko:20201022011432p:plain

自由に名前を付けて良いのですが今回は OMGITWORKS で作成。
f:id:knkomko:20201022011629p:plain

1. Visual Studio を管理者として実行

f:id:knkomko:20201022005712p:plain

GitHubからダウンロードした JetEntityFrameworkProvider を開く。
f:id:knkomko:20201022010426p:plain

2. install.cmd 編集

JetDdexProvider の install.cmd を開く。
f:id:knkomko:20201022010741p:plain

REGROOT のキーをレジストリエディタで作成した OMGITWORKS に変更。
f:id:knkomko:20201022011112p:plain

3. プロジェクトのコンパイル

コンパイルするためにビルドイベントの内容を編集します。
使用しているVisualStudioのバージョンによってパスが変わるため
環境に合わせてパスを変えて、コンパイルできるようにします。

3-1. JetDdexProvider ビルドイベント編集

JetDdexProvider のプロパティからビルドイベントを編集。
f:id:knkomko:20201022013407p:plain

① ビルド前イベントのコマンドライン

call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars32.bat"
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\gacutil.exe" /u JetEntityFrameworkProvider.dll

赤下線はVisualStudioのバージョンごとに変わるので確認して変更します。
f:id:knkomko:20201022012952p:plain

② ビルド後イベントのコマンドライン

"$(ProjectDir)Install.cmd" /ranu /codebase "$(TargetDir)$(TargetFileName)"

call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars32.bat"

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\gacutil.exe" /i "$(TargetDir)JetEntityFrameworkProvider.dll" /f

赤下線はVisualStudioのバージョンごとに変わるので確認して変更します。
f:id:knkomko:20201022013250p:plain

3-3. JetEntityFrameworkProvider ビルドイベント編集

JetEntityFrameworkProvider のプロパティからビルドイベントを編集。
f:id:knkomko:20201022013536p:plain

① ビルド前イベントのコマンドライン

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\gacutil.exe" /u "$(TargetName)"

赤下線はVisualStudioのバージョンごとに変わるので確認して変更します。
f:id:knkomko:20201022013643p:plain

② ビルド後イベントのコマンドライン

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\gacutil.exe" /if "$(TargetPath)"

赤下線はVisualStudioのバージョンごとに変わるのでパスを確認して変更します。
f:id:knkomko:20201022013829p:plain

3-4. JetDdexProvider, JetEntityFrameworkProvider リビルド

JetDdexProvider
f:id:knkomko:20201022014247p:plain

JetEntityFrameworkProvider
f:id:knkomko:20201022014320p:plain

正常終了し、出力にエラーメッセージが無ければ成功です。
f:id:knkomko:20201022014458p:plain

レジストリエディタからDataProviders, DataSourcesが作成されている事を確認します。
コンピューター\HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\OMGITWORKS
f:id:knkomko:20201022022629p:plain

3-5. VisualStudio2019 プライベートハイブ読み込み

レジストリでは、各種の情報がキー、サブキー、値と階層的に管理されている。
ハイブは、ハードウェア設定やソフトウェア設定、セキュリティ設定など、レジストリに保存される情報のうち、特定分野に関する一連の情報を識別するセクションを意味する。

Insider's Computer Dictionary:ハイブ とは? - @IT

プライベートハイブの編集方法については以下の記事が参考になりました。

Fortunately, you can use regedit.exe to load a private hive. You need to select the HKEY_USERS node, and click the File > Load Hive… menu. You select the privateregistry.bin file, give a name to the hive (I entered “VS2017PrivateRegistry”) and now you can see the 15.0_Config key populated as usual (note: use File > Unload Hive when done):

Some implications of the new modular setup of Visual Studio 2017 for VSX developers | Visual Studio Extensibility (VSX)

VisualStudioのレジストリにJetEntityFrameworkProviderを登録するのですが、2017からプライベートハイブに変わってしまいコンパイルだけで登録出来ないため、手作業で行います。

まずはVisualStudioのレジストリ(プライベートハイブ)を確認。
~\AppData\Local\Microsoft\VisualStudio\
f:id:knkomko:20201022015345p:plain

プライベートハイブのフォルダ名 16.0 はVisualStudioのバージョンです。
利用している開発環境のバージョンと一致するフォルダを探してください。
f:id:knkomko:20201022015514p:plain

プライベートハイブを編集する前に起動しているVisualStudioを全て終了します。
起動していると以下の警告メッセージが表示されて編集ができません。
f:id:knkomko:20201024214059p:plain

レジストリエディタにて HKEY_USER を選択。
f:id:knkomko:20201022021236p:plain

レジストリエディタのハイブの読み込みから privateregistry.bin を指定。
f:id:knkomko:20201022021429p:plain

キー名を付ける必要があるので分かりやすい名前を付けます。
f:id:knkomko:20201024220140p:plain

これによりVisualStudioのプライベートハイブが編集できるようになります。
f:id:knkomko:20201024220257p:plain

3-6. レジストリ DataProviders, DataSources エクスポート

DataProviders, DataSoures それぞれエクスポートします。
f:id:knkomko:20201024214647p:plain

ドキュメントフォルダにregというフォルダを作成してエクスポートしました。
f:id:knkomko:20201024214745p:plain

3-7. レジストリ DataProviders, DataSources 編集

エクスポートした DataProviders, DataSources を編集します。
間違えても良いように _new としてコピーしたものを編集します。
f:id:knkomko:20201024215153p:plain

regファイルを右クリックして、今回はメモ帳で編集しました。
f:id:knkomko:20201024220910p:plain

OMGITWORKSのパスを全て、プライベートハイブのパスに変更します。
・変更前
f:id:knkomko:20201024221110p:plain
・変更後
f:id:knkomko:20201024221421p:plain

3-8. レジストリ DataProviders, DataSources インポート

パスをプライベートハイブに変更した DataProviders, DataSources をレジストリエディタでインポートします。DataProviders, DataSourcesがある_Config が付くレジストリキーにインポートします。
f:id:knkomko:20201024222001p:plain

DataProviders を選択します。
f:id:knkomko:20201024225329p:plain

インポートから先ほど編集した DataProviders_new.reg を開きます。
f:id:knkomko:20201024225415p:plain

完了するとDataProvidersにJetDDEXProviderが追加されます。
f:id:knkomko:20201024225659p:plain

DataProviders と同様に DataSources もインポートします。

3-9. VisualStudio2019 プライベートハイブアンロード

読み込んでいたプライベートハイブを選択します。
f:id:knkomko:20201024223203p:plain

アンロードを左クリック。
f:id:knkomko:20201024223311p:plain

警告メッセージが表示されます。
f:id:knkomko:20201024223338p:plain

はいボタンを押してレジストリキーのアンロードを実行します。
f:id:knkomko:20201024223358p:plain

4. machine.config に JetEntityFrameworkProvider 追加

machine.config をデスクトップにコピーして編集をします。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config
f:id:knkomko:20201024223906p:plain

DbProviderFactories に JetEntityFrameworkProvider を追加します。
f:id:knkomko:20201024224319p:plain

元の場所にmachine.configを上書きをします。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config

DB First 確認

Accessでデータベースを作成します。
f:id:knkomko:20201024232924p:plain

NuGet から JetEntityFrameworkProvider をインストールします。
f:id:knkomko:20201024230343p:plain

ADO.NET Entity Data Model からDbContextの名称を入力して追加します。
f:id:knkomko:20201024233348p:plain

データベースから Code First を選択して次へ。
f:id:knkomko:20201024224654p:plain

新しい接続を左クリックします。
f:id:knkomko:20201024233433p:plain

データソースを変更します。
f:id:knkomko:20201024233531p:plain

<その他>からJet DDEX provider for JetEntityFrameworkProviderを選択します。
f:id:knkomko:20201024233649p:plain

DataSource と Provider を入力します。
f:id:knkomko:20201024233846p:plain

接続文字列が作成されます。
f:id:knkomko:20201024234031p:plain

モデルを作成するテーブルを選択します。
f:id:knkomko:20201024234106p:plain

Employee、SampleContext が作成できました。
f:id:knkomko:20201024234231p:plain