tags

.NET Core の Entity Framework で直接SQL文を実行する

.NET Coreでは基本 Entity Framework を使用するので直接SQL文を実行する事はありませんが、たまにSQL文を実行したい時があります。 Entity Frameworkを使用するので簡単なSQL文を実行したいだけの時でも「モデル」と「コンテキスト」は定義しておく必要があります。

引用 : https://docs.microsoft.com/ja-jp/aspnet/core/data/ef-mvc/advanced?view=aspnetcore-2.0#raw-sql-queries

● SQL文を直接実行(エンティティを返す)

(DBコンテキスト : _context)(テーブル:MYTABLE) を操作します

string sql = "SELECT * FROM MYTABLE";
var result = _context.Mytable.FromSql(sql);

サニタイズしたい場合は以下のように記述します

using System.Data.SqlClient;
var sp = new SqlParameter("nm", "tanaka");
var result = this.db.Ev100tl
    .FromSql("SELECT TOP 1 * FROM EV100TL WHERE NAME = @nm", sp);

● SQL文を直接実行

非クエリ コマンドに対して Database.ExecuteSqlCommand を使用します。

引用 : https://docs.microsoft.com/ja-jp/aspnet/core/data/ef-mvc/advanced?view=aspnetcore-2.0#raw-sql-queries

No.1231
05/24 16:42

edit

データファーストでモデルファイルを作成する

dotnet ef dbcontext scaffold "Server=データベースサーバ名;Database=ScaffoldDB;Trusted_Connection=True" Microsoft.EntityFrameworkCore.SqlServer -o Models

例 :

DBサーバ : MYPC\SQLEXPRESS
データベース : MyDb

の場合

dotnet ef dbcontext scaffold "Server=MYPC\SQLEXPRESS;Database=MyDb;Trusted_Connection=True" Microsoft.EntityFrameworkCore.SqlServer -o Models

● dotnet ef コマンドが使えない場合

1. .csproj ファイルの Project 配下に以下のコードを追加

<ItemGroup>
  <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
</ItemGroup>

2. コマンド

dotnet restore

を実行すると dotnet ef コマンドが使用できるようになります。

No.1230
05/23 22:38

edit

.Net core mvc で appsettings.json の設定をコントローラーから利用する

引用 : https://qiita.com/TsuyoshiUshio@github/items/f45700dc2e95e7c3992a

● appsettings.json ファイルに設定を書き込む

appsettings.json

  "MySettings": {
    "KEY": "hogehoge",
    "SECRET": "fugafuga",
  }

● モデルファイル AppSetting.cs を作成する

「Models」フォルダを右クリックして新しいクラスを作成します
appsettings.json の中身をすべてコピーして「編集」→「形式を選択して貼り付け」→「JSONをクラスとして張り付ける」を実行すると時間が短縮できます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace <あなたのプロジェクト名>.Models
{
    public class AppSettings
    {
        public Mysettings MySettings { get; set; }

        public class Mysettings
        {
            public string KEY{ get; set; }
            public string SECRET { get; set; }
        }

    }
}

● Startup.cs の書き換え

using <あなたのプロジェクト名>.Models;
using Microsoft.Extensions.Options;

を先頭に追加し、次のメソッドを書き換え

   public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.Configure<AppSettings>(Configuration);
        }

● コントローラー HomeController.cs の書き換え

using <あなたのプロジェクト名>.Models;
using Microsoft.Extensions.Options;

を先頭に追加し、次のプライベート変数とコンストラクタを追加

        private readonly AppSettings appSettings;

        public HomeController(IOptions<AppSettings> optionsAccessor)
        {
            this.appSettings = optionsAccessor.Value;
        }

以上でコントローラーの各メソッドで this.appSettings から appsettings.json の値が参照できます。

No.1229
05/24 09:29

edit

C#の命名規則

C#の命名規則について調べてみるとそこまで厳格には決められていない(例:プライベートメソッドは Camel ? または Pascal?) ので皆さんそれぞれ採用されているようですが

こちらの決め方がよいと思います
https://jikkenjo.net/309.html

privateなものはCamel
publicなものはPascal
静的な定数はPascal
インターフェイスのプレフィックスとして[I(大文字のアイ)]を付ける

プライベートメソッドは ... Pascal に一票(ここは宗教論争ですね)入れたいと思います。

参考 https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/naming-guidelines http://taka-say.hateblo.jp/entry/2014/05/26/005005

No.1228
05/23 19:20

edit

.NET core mvc の razorテンプレート

● Razorテンプレートへの値のセットとテンプレートでの表示

1. 値のセット

HogeController.cs

        public IActionResult Fuga()
        {
            ViewData["Message"] = "メッセージの表示テストです";
            return View();
        }

2. テンプレートでの表示

Fuga.cshtml

<h2>@ViewData["Title"]</h2>

3. ブラウザでの表示

デバッグを実行してブラウザのアドレス欄に http://localhost:50914/Hoge/Fuga と入力して移動すると

<h2>メッセージの表示テストです</h2>

が出力されます。

● RazorテンプレートからコントローラーへフォームのPOSTデータを渡す方法(1.ベタなやり方)

「Input」で渡した値を「Confirm」で受け取ってみます

Input.cshtml (入力画面)

    <form asp-controller="Hoge" asp-action="Confirm" method="post">
        @Html.AntiForgeryToken()
        <input type="text" name="Email" >
        <input type="text" name="Url" >
        <input type="submit" value="送信する">
    </form>

HogeController.cs (確認画面 - コントローラ)

        // POST: Hoge/Confirm
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Confirm(string Email, string Url)
        {
            ViewData["Email"] = Email;
            ViewData["Url"] = Url;
            return View();
        }

Confirm.cshtml(確認画面 - ビュー)

        <table>
            <tr>
                <td>Email</td>
                <td>@ViewData["Email"]</td>
            </tr>
            <tr>
                <td>Url</td>
                <td>@ViewData["Url"]</td>
            </tr>
        </table>

● RazorテンプレートからコントローラーへフォームのPOSTデータを渡す方法(2.スマートなやり方)

(1.)と同じく「Input」で渡した値を「Confirm」で受け取ってみます。
この時モデルを定義してモデルを受け渡します。

Input.cshtml (入力画面)

    <form asp-controller="Toukous" asp-action="Confirm" method="post">
        @Html.AntiForgeryToken()
        <input type="text" name="Email" >
        <input type="text" name="Url" >
        <input type="submit" value="送信する">
    </form>

Models/Hoge.cs(モデル)

namespace Hoge.Models
{
    public class Toukou
    {
        public int ID { get; set; }
        public string Email { get; set; }
        public string Url { get; set; }
    }
}

HogeController.cs (確認画面 - コントローラ) view()の引数で「テンプレートファイル」「モデル」を渡しています

        // POST: Hoge/Confirm
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Confirm(Toukou model)
        {
            return View("Confirm", model);
        }

Confirm.cshtml(確認画面 - ビュー)

@model Hoge.Models.Toukou

        <table>
            <tr>
                <th>@Html.DisplayNameFor(model => model.Email)</th>
                <td>@Html.DisplayFor(model => model.Email)</td>
            </tr>
            <tr>
                <th>@Html.DisplayNameFor(model => model.Url)</th>
                <td>@Html.DisplayFor(model => model.Url)</td>
            </tr>
        </table>

● テンプレートのレイアウトファイル(継承元)

デフォルトではレイアウト(継承元)のテンプレートファイルは

Views/Shared/_Layout.cshtml

にあります。

これは /Views/_ViewStart.cshtml に次のように定義されているので

@{
    Layout = "_Layout";
}

レイアウトファイルを変えたい場合はここを変更します。
レイアウトを使用しない場合は null をセットします。

No.1224
05/23 21:58

edit

.NET Core MVC モデルの追加とDBマイグレーション、コントローラー自動作成方法

コードファーストでDBとコントローラーを作成します。

● 1. モデルファイルの追加

「ソリューションエクスプローラー」→「/Models」を右クリック → 追加 → 「クラス」(モデルの名前を入力して「追加」)

● 2. モデル(DB定義)の記述

Movieクラスを作成した場合
/models/Movie.cs

    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }

● 3. DBマイグレーション

Visual Studioの「パッケージマネージャー コンソール」から

Add-Migration Initial
Update-Database

(または PowerShellから同様のコマンドを実行することができます。Mac、Unixの場合はこちら)

dotnet ef migrations add Initial
dotnet ef database update

● 4. コントローラーの自動生成

「ソリューションエクスプローラー」→「/Controllers」を右クリック → 追加 → 「コントローラー」 →「Entity Frameworkを利用したビューがあるMVCコントローラー」(モデルクラスを選択して「追加」)

● 5. 実行

「f5」でアプリを実行し
http://localhost:50914/Movies
へ移動し動作を確認する。

No.1225
05/23 22:10

edit

SQL Server へ 「SQL Server認証」でログインするユーザーを作成し .Net アプリのDB接続に使用する

SQL Serverへのログインはデフォルトでは Windows認証となっていますが、
ユーザーとパスワードをしていすればログインできる「SQL Server認証」でログインできるようにしてみます。

● 1. 「SQL Server認証」でログインするユーザーを登録する

Microsoft SQL ServerManagement Studio を起動して次のようにします。

「セキュリティ」→「ログイン」を右クリックして「新しいログイン」を選択する
・「ログイン名」を入力する
・「SQL Server認証」を選択する
・「パスワード」「パスワードの確認入力」を入力する
・「パスワードポリシーを適用する」のチェックを外す(簡単なパスワードを許可したい場合)
・「既定のデータベース」、使用したいデータベースを選択
・「既定の言語」、 Japanese を選択
・「ユーザーマッピング」ページへ移動し操作したいデータベースの横にある「マップ」のチェックボックスのチェックをつける
・操作したいデータベースを選択し、下の画面の「db_owner」にチェックをつける

● 2. DB全体の認証モードを変更する

1. モード認証を変更

サーバー名を右クリック → プロパティ → 「セキュリティ」を選択 →「SQL Server認証モードとWindows認証モード」を選択 → OK

2. SQL Server を再起動

SQL Server 構成マネージャー から SQL Server を再起動する

● 3. ログインの確認

Microsoft SQL ServerManagement Studio を起動して 「SQL Server認証」 を選択し先ほど入力したIDとパスワードでログインできることを確認する。

● 4. .NET アプリでの使用

SQLサーバ名 : WINSERVER2016\\SQLEXPRESS
データベース名 : testdb
ID : hogehoge
PASS : mypass

で接続するには appsettings.json に次のように記述します。

"ConnectionStrings": {
    "DefaultConnection": "Server=WINSERVER2016\\SQLEXPRESS;Initial Catalog=testdb;MultipleActiveResultSets=true;User ID=hogehoge;Password=mypass"
  },

引用 : https://stackoverflow.com/questions/42921947/adding-a-sql-connection-to-my-asp-net-core-application-how-to-define-connectio

No.1221
05/12 00:07

edit

.Net 本番機でのエラーを把握する

web.config を次のように書き換えます

<aspNetCore processPath="dotnet" arguments=".\TestLoginApp5.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
<aspNetCore processPath="dotnet" arguments=".\TestLoginApp5.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout">
	<environmentVariables>
	<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
	</environmentVariables>
</aspNetCore>

No.1220
05/11 17:02

edit

dotnet コマンド CLI

● dotnet ef(EntityFramework)データベース コマンド

# CLI版を使う際には追加パッケージをインストールします。
dotnet add package Microsoft.EntityFrameworkCore.Tools.DotNet

# Add-Migration 適当な名前
dotnet ef migrations add 適当な名前

# Remove-Migration
dotnet ef migrations remove

# Update-Database
dotnet ef database update

# Drop-Database
dotnet ef database drop

引用: EntityFrameworkCoreを.NET Core コンソールアプリでCodeFirstに使う - Qiita

No.1219
05/11 11:13

edit

.Net Core MVC で ユーザー認証のアプリを5分で作成する

● 1. Visual Studio 2017 から 新規プロジェクトを作成する

その際以下の認証機能を追加します

・メニューの「新規作成」→「プロジェクト」→「ASP .Net CORE MVCアプリケーション」で【OK】を押す。
・「Webアプリケーション(モデル ビューコントローラー)」「認証の変更」「個別のユーザーアカウント」を選択して【OK】を押す。

これでプロジェクトファイルとソースコード一式が生成されます。

● 2. 接続するデータベースの設定とデータベース名を変更する

appsettings.json の DB接続の項目を変更します。

appsettings.json

  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-TestLogin4-3FFC9AB5-5122-4BFD-9097-4F6113EE0EA3;Trusted_Connection=True;MultipleActiveResultSets=true"
  },

これの

"DefaultConnection": "Server=(localdb)\\mssqllocaldb;

DefaultConnectionを ローカルDBからSQL Server に変更します ↓

PCの名前が MYPCの場合

"DefaultConnection": "Server=MYPC\\SQLEXPRESS;

またデータベース名はデフォルトでは
aspnet-TestLogin4-3FFC9AB5-5122-4BFD-9097-4F6113EE0EA3 といった長い名前がつけられます。 これも好きな名前に変えておきます。

Database=aspnet-TestLogin4-3FFC9AB5-5122-4BFD-9097-4F6113EE0EA3;

↓ (データベース名を mydb に変更します)

Database=mydb;

● 3. データベースのマイグレーション

A. パッケージマネージャーコンソール を使用する場合

パッケージマネージャーコンソールから

Update-Database

と入力します。

B. PowerShellを使用する場合

PowerShellを開き、プロジェクトがあるディレクトリに移動してから

dotnet ef database update

と入力します。

以上です。

● 4. Visual Studio からビルドして実行する

ローカルで動作することを確認します

● 5. サーバに SQL Serverをインストールする

1. SQL Server 2017 Express をインストールする

(10GBまで無料の SQL Server 2017 Express をインストールします) https://www.microsoft.com/ja-jp/sql-server/sql-server-editions-express

2. SQL Server Management Studio をインストールする

https://go.microsoft.com/fwlink/?linkid=870039

No.1218
05/19 13:10

edit

Visual Studio からFTPを使って .Net Core MVC アプリを手動でデプロイする

● 1.Visual Studio から Webデプロイパッケージ を使用しアプリの zip ファイルを作成する

・ Visual Studio 2017 を立ち上げてアプリのプロジェクトファイルを開く

・ 「ソリューションエクスプローラー」のプロジェクトを右クリックして「発行」

・ 「設定」を押して発行方法「Webデプロイパッケージ」にして発行する。

指定したディレクトリに .zip ファイルが生成されます。

●2. デプロイするサーバー側に .NET CORE SDK をインストールする

https://www.microsoft.com/net/download/windows

●3. デプロイパッケージをインポートする

・FTPを使ってサーバへ .zip ファイルを送信する

・「インターネット インフォメーション サービス (IIS) マネージャー」の左のメニューからアプリを配置したいサイトを選択し「アプリケーションのインポート」を実行する

.zip ファイルや 発行先ディレクトリの入力を求められるので入力します。

●4. .Net Core MVC アプリを起動する

・まず dotnet コマンドを使って組み込みサーバで動作を確認する

PowerShellを立ち上げて、該当ディレクトリに移動した後で次のコマンドを入力 (例: アプリ名が HelloWorld01 の場合)

 dotnet HelloWorld01.dll

組み込みサーバが立ち上がるので表示されるアドレスを入力して動作を確認します。 (確認後 Press Ctrl+C でサーバを終了。)

・サイトのurlを入力してアクセスを確認する

以上です。 手動のデプロイも簡単です。

No.1215
05/09 11:57

edit

Windows PowerShell の起動の仕方とエイリアスの設定

● Windows PowerShell の起動の仕方

Explorer で該当ディレクトリに移動しアドレス欄に powershell と入力して実行すると、該当ディレクトリをカレントディレクトリとして立ち上がります

● bash の .bash_profile のように、Windows PowerShell のエイリアスを設定する

● 管理者権限でPowerShell を起動し、以下を実行する

Set-ExecutionPolicy RemoteSigned

● 普通にPowerShell を起動し、以下を実行する

New-item –type file –force $profile
notepad $profile

ファイルが開くのでエイリアスを追加して保存する

Set-Alias g git
Set-Alias l Get-ChildItem

PowerShell を再起動するとエイリアスが使えるようになっています。

No.1212
05/11 11:13

edit

Windowsサーバに open sshd をインストールして他のマシンからWindowsへssh接続できるようにする

● 1. Windows用 ssh をダウンロードする

https://github.com/PowerShell/Win32-OpenSSH/releases
(64bit版、32bit版どちらもあるのでお使いのサーバ用の zip ファイルをダウンロード)

● 2. 解凍して任意の場所に置く

c:\openssh\

に置きます。

● 3. 環境変数にパスを追加する

・「Windowsアイコンを右クリック」→「システム」をクリック
・「システムの詳細設定」→「環境変数」をクリック
・「システム環境変数」の 「Path」 を選択して「編集」をクリック。
・「追加」を押して「C:\openssh」を追加

● 4. sshサーバをインストール

Power Shellを起動して以下を実行します

cd \openssh
.\install-sshd.ps1
New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSH

● 5. sshサーバの自動起動をセット

Power Shellを起動して以下を実行します

Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic

● 6. Windowsサーバを再起動

再起動後に他のマシンからssh接続を確認します。

No.1204
05/10 10:45

edit