Oracle製のMySQLコネクターは、Entity Framework Core 2.1のマイグレーションに対応していない
データベースのマイグレーションを行うためにデータレイヤーのプロジェクト(Data)でマイグレーションスクリプトの追加コマンドを打ったら
cd Data migrations add First --startup-project "..\WebSite"
こんなエラーが出ました
An error occurred while accessing the IWebHost on class ‘Program’. Continuing without the application service provider. Error: Object reference not set to an instance of an object.
MSDN の デザイン時 DbContext 作成 を見ると、IDesignTimeDbContextFactory を実装したデザイン時のファクトリを用意するということだったので、こんなクラスを作って WebSite プロジェクトにに追加してみた。
public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory { public DefaultDbContext CreateDbContext(string[] args) { var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("connectionStrings.json") .Build(); var builder = new DbContextOptionsBuilder() .UseMySql(configuration.GetConnectionString("idpdb")); return new DefaultDbContext(builder.Options); } }
今度はこんな感じのエラーが出た
Exception message:
System.MissingMethodException: ‘Method not found: ‘Void Microsoft.EntityFrameworkCore.Storage.Internal.RelationalParameterBuilder..ctor(Microsoft.EntityFrameworkCore.Storage.IRelationalTypeMapper)’.’
Entity Framework Core 2.1 のプレビュー時点でのこんな投稿が、どうも Oracle 版の MySql コネクターは Entity Framework の内部的なクラスを触っているようで、Entity Framework のバージョンアップについてこれていないっぽい。
EF Core 2.1 Preview 1 throws MissingMethodException when using Pomelo.EntityFrameworkCore.MySql
MySqlのフォーラムにもバグとして起票はされているけれど動きはなさそう。
https://bugs.mysql.com/bug.php?id=89855
Oracle は ODP.NET の時も Entity Framework に対する動きがだいぶ遅くてもやもやしたけれど、MySQL も同じっぽいなー。ということで、しばらくは Pomelo 版の MySQL コネクターを使ってみようと思います。
https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql
書き換えは、UseMySQL を UseMySql にするだけなので簡単ですね。
services.AddDbContext(options => options.UseMySql( Configuration.GetConnectionString("db") , builder => builder.MigrationsAssembly("ata")) );
コンテナサポートを追加するで追加した Dockerfile ファイルと、コンテナオーケストレーターサポートの追加で追加された Dockerfile が微妙に違う
こちらはプロジェクトの追加時、もしくはコンテナサポートの追加時に追加される Dockerfile
パスの指定にダブルクオートがある
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 9080 EXPOSE 44372 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY ["../WebApplication3/WebApplication3.csproj", "../WebApplication3/"] RUN dotnet restore "../WebApplication3/WebApplication3.csproj" COPY . . WORKDIR "/src/../WebApplication3" RUN dotnet build "WebApplication3.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "WebApplication3.csproj" -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "WebApplication3.dll"]
コンテナオーケストレーターサポートの追加で追加された、もしくは上書きされた Dockerfile は、パスの指定にダブルクオートが無い
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 9080 EXPOSE 44372 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY ../WebApplication3/WebApplication3.csproj ../WebApplication3/ RUN dotnet restore ../WebApplication3/WebApplication3.csproj COPY . . WORKDIR /src/../WebApplication3 RUN dotnet build WebApplication3.csproj -c Release -o /app FROM build AS publish RUN dotnet publish WebApplication3.csproj -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "WebApplication3.dll"]
ん?ソリューションフォルダーからの相対位置に空白がある状態で、コンテナオーケストレーターサポートを追加したらどうなるんだろう。
docker build は普通に通るので問題ないのか。
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 9701 EXPOSE 44374 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY test test/WebApplication4/WebApplication4.csproj test test/WebApplication4/ RUN dotnet restore test test/WebApplication4/WebApplication4.csproj COPY . . WORKDIR /src/test test/WebApplication4 RUN dotnet build WebApplication4.csproj -c Release -o /app FROM build AS publish RUN dotnet publish WebApplication4.csproj -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "WebApplication4.dll"]
Visual Studio 2017 15.8でdocker-composeを利用する場合は、コンテナオーケストレーターレーターサポートからdocker-compose.ymlを追加する
Visual Studio 2017 バージョン 15.8 で Docker サポートを有効にした ASP.NET Core のアプリケーションを作ったら、docker-compose.yml が自動的に追加されなかったのでメモ
「Visual Studio Tools for Docker と ASP.NET Core」の「アプリにコンテナー オーケストレーター サポートを追加する」を参照すると、下記のような記載が追加されていた。
Visual Studio 2017 バージョン 15.8 以降では、指示された場合にのみ、オーケストレーション ソリューションが追加されます。 ソリューション エクスプローラーでプロジェクトを右クリックして、[追加] > [Container Orchestrator Support](コンテナー オーケストレーター サポート) の順に選択します。 Docker Compose と Service Fabric という 2 つの異なる選択肢が提供されています。
MSDNにある通り、プロジェクトのプロパティー > 追加 > コンテナオーケストレーターサポートを選択し、
Docker Compose を選択すると、
ベースイメージを Windows にするか Linux にするかを尋ねられるのでOSを選択する。
ソリューションに docker-compose が追加され、スタートアッププロジェクトに設定される。
こんな感じの docker-compose.yml が追加される。
version: '3.4' services: webapplication1: image: ${DOCKER_REGISTRY}webapplication1 build: context: . dockerfile: WebApplication1/Dockerfile
複数のプロジェクトに対してコンテナオーケストレーターサポートを追加すると、docker-compose.yml に設定が追加されるので、必要に応じてdepends_onを設定すればよい。
version: '3.4' services: webapplication1: image: ${DOCKER_REGISTRY}webapplication1 build: context: . dockerfile: WebApplication1/Dockerfile webapplication2: image: ${DOCKER_REGISTRY}webapplication2 build: context: . dockerfile: WebApplication2/Dockerfile