.NetのEntityFrameworkCoreでSQL Server接続を設定してみた
EntityFrameworkCore設定
.NetプロジェクトにEntityFrameworkCoreを設定する歩法についてメモする。
今回の対象はSql Serverにするが、対象はNugetパッケージでインストールする物によって変わる。
ProjectにNugetパッケージを追加する。
バージョンはテスト時点のバージョン
- Microsoft.EntityFrameworkCore.Design v5.0.11 - Microsoft.EnrityFrameworkCore.SqlServer v5.0.11 - Microsoft.EnrityFrameworkCore.Tools v5.0.11
※基本は「 Sqlserver」だけあれば接続可能
EntityFrameworkCore CLI Toolsのインストール
dotnet tool install --global dotnet-ef
EF Core ツールリファレンス (.NET CLI)-EF Core | Microsoft Docs
DbContextとModels作成
対象のプロジェクトファイルがあるフォルダーまで移動後、実行
dotnet ef dbcontext scaffold "Server=127.0.0.1;Database=testdb;User Id=sa;Password=password" Microsoft.EntityFrameworkCore.SqlServer -o Models
※生成ファイルはプロジェクトのModelsフォルダーに生成される。
接続情報の環境設定化
appsetting.json
{ "ConnectionStrings": { "DBConnection": "Server=127.0.0.1;Database=testdb;User Id=sa;Password=password" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information", "Microsoft.EntityFrameworkCore.Database.Command": "Information" } }, "AllowedHosts": "*" }
Startup.cs修正
using Microsoft.Extensions.DependencyInjection; using Microsoft.EntityFrameworkCore; public void ConfigureServices(IServiceCollection services) { #if DEBUG services.AddDbContextFactory<testdbContext>(opt => opt.UseSqlServer(Configuration.GetConnectionString("DBConnection")) .EnableSensitiveDataLogging()); #else services.AddDbContextFactory<testdbContext>( options => options.UseSqlServer( Configuration.GetConnectionString("DBConnection"))); #endif services.AddRazorPages(); services.AddServerSideBlazor(); ..... }
- DEBUG時にはEnableSensitiveDataLoggingにより、SQLログを出力する。
使用例
razor
@using Microsoft.EntityFrameworkCore @implements IDisposable @inject IDbContextFactory<testdbContext> DbFactory @code { private MyProject.Models.testdb context; protected override async Task OnInitializedAsync() { Busy = true; try { context = DbFactory.CreateDbContext(); List = await context.Contacts .SingleOrDefaultAsync(c => c.Id == ContactId); } finally { Busy = false; } await base.OnInitializedAsync(); } }
ASP.NET Core Blazor Server と Entity Framework Core (EFCore) | Microsoft Docs ASP.NET Core での依存関係の挿入 | Microsoft Docs
WPF用タイマー実装
WPF画面上で一定時間ごとにリフレシュする
普通のTimerではプロセスがSTAじゃないからとかエラーになったため、調べたらWPFの場合、WPF内部のDispatcherを利用しなければならないらしい
XAMLページ
using System.Threading; public partial class MainWindow : Window { private Timer _timer; public void CallBackTimerAction(object state) { this.Dispatcher.Invoke(new Action(() => { ///MyAction// }) ); } public void StartTImer() { _timer = new Timer(CallBackTimerAction, null, Timeout.Infinite, Timeout.Infinite); _timer.Change(0, 10000); // 10秒単位で、すぐ実行 //終了時にタイマーを停止させる。 this.Closing += (s, o) => { _timer.Change(Timeout.Infinite, Timeout.Infinite); // タイマ停止 _timer.Dispose(); }; } }
- CallBackTimerAction(object state) タイマーが実行する処理、ここでDispatcher.Invokeされる。
- new Timer(CallBackTimerAction, null, Timeout.Infinite, Timeout.Infinite); タイマーを定義、コールバックを指定する。
- _timer.Change(0, 10000); すぐ実行後、10000ミリ秒後に再度コールバックされる。
- this.Closing += (s, o) タイマーは自動で終了しないため、Window終了時に一緒に終了する。
Ubuntu 20.04にdotnetをインストール
dotnet インストール
Linuxで環境構築してみようと思ってので、Ubuntu 20.04にdotnetインストール手順を残してみます。
信頼されたキーの一覧に Microsoft パッケージ署名キーを追加
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb
SDKインストール
sudo apt-get update; \ sudo apt-get install -y apt-transport-https && \ sudo apt-get update && \ sudo apt-get install -y dotnet-sdk-5.0
ランタイムのインストール
sudo apt-get update; \ sudo apt-get install -y apt-transport-https && \ sudo apt-get update && \ sudo apt-get install -y aspnetcore-runtime-5.0
参考
コマンドは以下を参照しました。バージョンによって非対応の場合があるようなので、最新を確認して実行する必要があります。
dotnet ubuntu関連
https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu
dotnet Help
https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet
OracleのRAW型をSQL ServerのVARBINARY型への移行方法
OracleのテーブルをMSSQLへ移行する
ORACLEがRAW型を持つデータがあり、SQL Serverへ移行する方法を探した結果
なんとか解決したので、メモ。
OracleのRAW型に対応するMS SQLServerの型はVARBINARY型
CREATE TABLE rawdata ( PASSWORD RAW(64) );
CREATE TABLE bindata ( PASSWORD VARBINARY(64) );
OracleのRAW型はRAWTOHEXでHEX値として出力
SELECT RAWTOHEX(PASSWORD) AS PASSWORD FROM rawdata; ------- PASSWORD 88db98ae696277dd28b0d2bda6e3.... eaead8048dbe6d7f375bfd11d8947f....
SQLSERVERへは’0x'をつけてHEX値としてINSERTする
insert into bindata values (0x88db98ae696277dd28b0d2bda6e3....);
ORACLEのSELECT文でInsert文を作る
SELECT 'insert into bindata values (0x' || RAWTOHEX(PASSWORD) || ');' FROM bindata
参考
RAW Data Type - Oracle to SQL Server Migration - SQLines Open Source Tools
タスクスケジューラ、タスク作成メモ
(0x1)エラーになる
操作のプログラムをbatファイルにしていたりすると、実行パスが認識されず、エラーになる。
解決:開始(オプション)に実行パスを設定してする。
その他、 最上位の権限で実行するがチェックされていると同じエラーになる。
裏でタスクが実行されていない?
確認する。 全般の「ユーザーがログオンしているかどうかに関わらず実行する」にチェックをいれる。
Image 関連メモ
Imageの変換
Imageからbyte[]への変換
ImageConverter imgconv = new ImageConverter(); byte[] b = (byte[])imgconv.ConvertTo(myThumbnail, typeof(byte[]));
byte[]へからImageへの変換
byte[] b ; Image img; using (var ms = new System.IO.MemoryStream(b)) { img = Image.FromStream(ms); }
byte[]からBase64への変換
byte[] b ;
String base64 = Convert.ToBase64String(b);
サムネイル画像を生成する
// Callback指定、Delegateは使用できない模様 public bool ThumbnailCallback() { return false; } public main() { Image img = new Image("c:\work\img1.jpg"); Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback); Image myThumbnail = img.GetThumbnailImage40, 40, myCallback, IntPtr.Zero); }
イメージをWebページに表示する
public String ImageSrcBase64 { get { return Convert.ToBase64String(_b); } }
<img src="data:image/jpeg;base64,<%=Html.DisplayFor(m => m.ImageSrcBase64) %>"