.NET Coreでコードファーストを使ってDBを作成するまでは大きく分けて次の手順となります。
・1. csファイルの作成と編集
- モデルクラスの作成
- DBコンテキストの作成
- Startup.cs の ConfigureServices() メソッド内に コンテキスト読込を追加
・2. マイグレーションファイルの生成( dotnet ef migrations add )
・3. マイグレーションの実行( dotnet ef database update )
dotnet コマンドは PowerShell から実行します。(Visual Studioのコンソールではありません。)
Models/Memo.cs を以下のように作成
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace 【アプリ名】.Models
{
public class Memo
{
public int ID { get; set; }
public string Title { get; set; }
}
}
IDを表すカラム名は必ず大文字で「ID」である必要があります。
Data/MyContext.cs を以下の内容で作成
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using 【アプリ名】.Models;
namespace 【アプリ名】.Data
{
public class MyContext : DbContext
{
public MyContext( DbContextOptions options ) : base( options )
{
}
public DbSet<Memo> Memo { get; set; }
}
}
Startup.cs に以下の行を追加
public void ConfigureServices(IServiceCollection services)
{
// コンテキストクラスを追加ここから
services.AddDbContext<MyContext>( options => options.UseSqlServer(
Configuration.GetConnectionString( "DefaultConnection" )
) );
// コンテキストクラスを追加ここまで
(options.UseSqlServer)は MS SQL Server を使うときに記述します。
(データベースの種類によって書き換えること)
dotnet ef migrations add ver1.0
複数コンテキストがある場合はコンテキストを指定する必要があります。
dotnet ef migrations add __My__Ver1.2__ --context MyContex
このとき Migrations ディレクトリ内に次のようなファイルが生成されます。
20180704061421___My__Ver1.2__.cs
20180704061421___My__Ver1.2__.Designer.cs
dotnet ef migrations add __ApplicationDb__Ver1.2__ --context ApplicationDbContext
dotnet ef database update
dotnet ef database update --context MyContext
データベース全体を Drop します
dotnet ef database drop
dotnet ef database drop -f
複数コンテキストがある場合はコンテキストを指定する必要があります。 (ただしDB全体がdropされるので注意)
dotnet ef database drop --context ApplicationDbContext -f
vagrant init centos/7
vagrant up
vagrant ssh
Centos7の仮想マシンにssh接続したらインストールをしていきます
su -
yum update -y
yum install -y libunwind libicu lsof
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
yum list | grep dotnet
インストールする dotnet のバージョンを確認します
yum install -y dotnet-sdk-2.1.4.x86_64
上記コマンドのリストの中からインストールするパッケージを指定します
dotnet --version
このようなに dotnetのバージョンが帰ってくればOK (例)
2.1.4
dotnet new console -o myApp
cd myApp
dotnet run
これで
Hello World!
が表示されればOKです。
dotnet new mvc -o testApp
cd testApp
dotnet publish -o ./published -r linux-x64
dotnet published/testApp.dll
(これで内蔵サーバが立ちあがります)
Content root path: /home/vagrant/dotnet/testApp
Now listening on: http://localhost:5000
curl で接続を確認する
curl http://localhost:5000
確認できたら firewalld を適切に設定してください。
systemctl stop firewalld
lsof -i:5000
Google Chromeなどのブラウザから
192.168.33.10:5000
を開きます。
vi /etc/yum.repos.d/nginx.repo
こちらの内容を保存する
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
nginxのインストール
yum install -y nginx
systemctl enable nginx
systemctl start nginx
nginx -v
Google Chromeなどのブラウザから
192.168.33.10
を開きます。nginxの画面が出ればOK
cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.backup
vi /etc/nginx/conf.d/default.conf
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
↓ このように書き換えます
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
nginxの再起動
sudo nginx -s reload
sudo cat /var/log/audit/audit.log | grep nginx | grep denied
setsebool httpd_can_network_connect on -P
https://stackoverflow.com/questions/23948527/13-permission-denied-while-connecting-to-upstreamnginx
Google Chromeなどのブラウザから
192.168.33.10
を開きます。.NET Core MVC アプリケーションの画面が出ればOKです。
dotnet publish -o ./published -r centos.7-x64
あとは published フォルダを vagrant のサーバにアップして
dotnet ./published/アプリ名.dll
で起動します。
Programs.cs
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
↓
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
// 追加ここから
.UseKestrel(options =>
{
options.Listen(System.Net.IPAddress.Any, 5000);
})
// 追加ここまで
.Build();
}
・「ソリューションエクスプローラー」からプロジェクトを右クリックして「エクスプローラーでフォルダーを開く」
・「 project名.csproj」ファイルをエディタで開く
・次のように修正する
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
↓
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<RuntimeIdentifiers>win10-x64</RuntimeIdentifiers>
</PropertyGroup>
この状態で発行すると自己完結型で発行されます。
この時の「win10-x64」は以下の RIDカタログ を参考にしてください。
https://docs.microsoft.com/ja-jp/dotnet/core/rid-catalog
https://docs.microsoft.com/ja-jp/dotnet/core/deploying/#self-contained-deployments-scd
Web.config
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
ちなみに Apache だと .htaccess で次のように記述します。 .htaccess の場合
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin: "*"
</IfModule>
ASP .NETアプリ の「発行」時に ApplicationConfig.xml を発行させないようにするには
<プロジェクトフォルダ>/Properties/PublishProfiles/Profile.pubxmlに以下を追加します
<PropertyGroup>
の下に次の項目を追加します。
<ExcludeFilesFromDeployment>ApplicationConfig.xml</ExcludeFilesFromDeployment>
.NET Coreが Linuxや Macに対応したのに合わせてデータベースツールも LinuxやMac対応できるツールが新しく Microsoftから出ています
https://github.com/Microsoft/sqlopsstudio
Mac, Linux Windows対応です。
apacheでいう .htaccess にあたるのが IIS の Web.config です。
このファイルに次のように記述します。
例) test.txt を非表示にする
Web.config
<configuration>
<system.webServer>
<security>
<requestFiltering>
<denyUrlSequences>
<add sequence="test" />
</denyUrlSequences>
<fileExtensions>
<add fileExtension=".txt" allowed="false" />
</fileExtensions>
</requestFiltering>
</security>
</system.webServer>
<configuration>
.NET WEBアプリでは XSS対策として HTMLタグらしきものを送信するとエラーとなります。 エラーになると次のようなエラーが表示されます
アプリケーションでサーバー エラーが発生しました。
YourController.cs
[ValidateInput( false )]
を加えます。 例 )
[ValidateInput( false )]
public ActionResult Index( Entry model )
{
.....
}
Web.config
<system.web>
<customErrors defaultRedirect="~/Error/DefaultError.cshtml" mode="RemoteOnly">
<error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>
mode="RemoteOnly"
にするとリモートでのみカスタムエラー画面が表示されます。
ローカルとリモート両方でカスタムエラー画面を表示させるには
mode="On"
とします。
引用 : https://www.wareko.jp/blog/post-21910
your-view-file.cshtml
@{
var baseUrl = ""
+ Request.Url.Scheme + "://"
+ Request.Url.Authority
+ Request.ApplicationPath.TrimEnd('/');
}
@baseUrl/controller/method
で
http://localhost:49983/controller/method
と表示されます。
コントローラーから ViewData で渡す場合は
YourController.cs
string BASE_URL = Request.Url.Scheme + "://" + Request.Url.Authority + Request.ApplicationPath.TrimEnd( '/' );
ViewData["BASE_URL"] = BASE_URL;
your-view-file.cshtml
@ViewData["BASE_URL"]/controller/method
で渡します。
Razorテンプレート内では @Request.ApplicationPath のように直接記述することができます。
<table>
<tr><td>Request.ApplicationPath</td><td>@Request.ApplicationPath</td></tr>
<tr><td>Request.FilePath</td><td>@Request.FilePath</td></tr>
<tr><td>Request.Path</td><td>@Request.Path</td></tr>
<tr><td>Request.FilePath</td><td>@Request.FilePath</td></tr>
<tr><td>Request.PathInfo</td><td>@Request.PathInfo</td></tr>
<tr><td>Request.PhysicalApplicationPath</td><td>@Request.PhysicalApplicationPath</td></tr>
<tr><td>Request.PhysicalPath</td><td>@Request.PhysicalPath</td></tr>
<tr><td>Request.RawUrl</td><td>@Request.RawUrl</td></tr>
<tr><td>Request.Url</td><td>@Request.Url</td></tr>
</table>
例えば
http://localhost:49983/Debug/Url
へのアクセスは
Request.ApplicationPath | / |
Request.FilePath | /Debug/Url |
Request.Path | /Debug/Url |
Request.FilePath | /Debug/Url |
Request.PathInfo | |
Request.PhysicalApplicationPath | C:\my_dir\MY-PROJECT\PROJECT\ |
Request.PhysicalPath | C:\my_dir\MY-PROJECT\PROJECT\Debug\Url |
Request.RawUrl | /Debug/Url |
Request.Url | http://localhost:49983/Debug/Url |
のような表示になります。
HTMLヘルパーはビュー( .cshtml )にて @Html.メソッド名 にて使用します。
例(HTMLエスケープを行わずそのまま出力する Raw() を呼び出す)
ViewData["message"] = "改行<br>します";
@Html.Raw( ViewData["message"] )
表示結果
改行
します
こちらを参考に
http://blog.shibayan.jp/entry/20110327/1301152413
例) 改行を<BR>タグに変換する自作ヘルパーを作成します。
【プロジェクト名】/Helpers/Myhelper.cs
using System;
using System.Web;
using System.Web.Mvc;
namespace 【プロジェクト名】.Helpers
{
public static class Myhelper
{
public static MvcHtmlString newline2br( this HtmlHelper helper, string arg )
{
return MvcHtmlString.Create( arg.Replace( "\r\n", "\n" ).Replace( "\r", "\n" ).Replace( "\n", "<br>" ) );
}
}
}
テンプレートには以下のように記述します
mytemplate.cshtml
@using EVAA.Helpers
@Html.newline2br( "テスト\n文字列" )
.NET MVC ページで 独自の404ページを設置する
Web.config の「system.web」の下に 404 エラー時に /Error/NotFound へ移動するよう設定します
Web.config
<system.web>
<!--独自の404ページ-->
<customErrors defaultRedirect="~/Error/" mode="On">
<error statusCode="404" redirect="~/Error/NotFound"/>
</customErrors>
<!--独自の404ページ-->
ネームスペースの「MYAPP」のところは適宜書き換えてください。 NotFound のビューを返すようにしてあります
/Controllers/ErrorController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MYAPP.Controllers
{
public class ErrorController : Controller
{
// GET: Error
public ActionResult Index()
{
return View();
}
// GET: Error/NotFound
public ActionResult NotFound()
{
ViewBag.Title = "Error 404";
return View( "NotFound" );
}
}
}
お好きなhtmlを作成してください。
/Views/Error/NotFound.cshtml
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>404 Not Found.</h1>
</body>
</html>
Session["キー"] = 値;
Session["login_name"] = "HogeHoge";
Session["キー"]
Object nameObj = Session["login_name"];
string firstName = (string)(Session["First"]);
文字列でほしいときは string 型にキャストします
Session["login_name"] = "";
Session.Remove("login_name");
Session.RemoveAll()
https://msdn.microsoft.com/ja-jp/library/cc338759.aspx
foreach (string key in Session.Keys)
{
Debug.WriteLine( key + " - " + Session[key].ToString() + "<br />" );
}
NLog.Configに以下のように設定します
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
internalLogFile="C:\<あなたのプロジェクトディレクトリ>\internal.log"
internalLogLevel="Trace"
internalLogToConsole="true"
internalLogToConsoleError="true"
internalLogToTrace="true" >
NuGetからインストールします。 Visual Studioなら「ソリューションエクスプローラー」を右クリックして「NuGetパッケージの管理」から「NLog」を検索してインストールします
NLogを使いたいクラスにプロパティ logger をセットします。
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
ログへ出力します
logger.Info( "情報ログ" );
logger.Debug( "デバッグログ" );
logger.Trace( "トレースログ" );
ログにはレベルが存在します。レベルによって処理を分けたりするためです。
(エラーの時は別ファイルに保存したり、エラーの時はメールを送信したりといった感じです。)
(NLogのログレベル。上から順に需要)
logger.Fatal("致命的レベル");
logger.Error("エラーレベル");
logger.Warn("警告レベル");
logger.Info("情報レベル");
logger.Debug("デバッグレベル");
logger.Trace("トレースレベル");
NLog.Config というファイルがインストール時に自動生成されます (自動生成されないこともあります。) その時は以下のようなファイル NLog.Config を プロジェクトのフォルダに作成します。
NLog.Config
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="normal"
xsi:type="File"
encoding="UTF-8"
lineEnding="LF"
fileName="${basedir}/logs/event.log"
layout="[${longdate}] [${uppercase:${level:padding=5}}] ${callsite}() [${message}] ${exception:format=tostring}"
archiveNumbering="Date"
archiveFileName="${basedir}/logs/archive/{#}-event.log"
archiveEvery="Day" archiveDateFormat="yyyyMMdd"
maxArchiveFiles="7" />
<target name="error"
xsi:type="File"
encoding="UTF-8"
lineEnding="LF"
layout="[${longdate}] [${uppercase:${level:padding=5}}] ${message} - ${callsite}() ${exception:format=tostring}"
fileName="${basedir}/logs/error.log"
archiveNumbering="Date"
archiveFileName="${basedir}/logs/archive/{#}-error.log"
archiveEvery="Day" archiveDateFormat="yyyyMMdd"
maxArchiveFiles="7"/>
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="normal" />
<logger name="*" minlevel="Trace" writeTo="normal" />
<logger name="*" levels="Error,Fatal" writeTo="error"/>
</rules>
</nlog>
${basedir} というのが出てきますが、これは AppDomain.CurrentDomain.BaseDirectory の事です。
場所がわからない場合は次のようにして確認してみてください。
Debug.WriteLine( AppDomain.CurrentDomain.BaseDirectory );
DB処理など try catch したい場合は次のように記述します
try
{
logger.Info( "DB処理 - 開始" );
// ここにDB処理
logger.Info( "DB処理 - 正常完了" );
}
catch (Exception ex)
{
logger.Error( ex );
throw;
}
.NET C# の try catch 例外エラー サンプル
スニペットとして登録しておいておくといいと思います。
try
{
// Your code here ...
}
catch (Exception ex)
{
logger.Error( ex );
Debug.WriteLine( "=======================================" );
Debug.WriteLine( ex.Message );
Debug.WriteLine( "=======================================" );
Debug.WriteLine( ex.StackTrace );
Debug.WriteLine( "=======================================" );
Debug.WriteLine( "エラーが発生しました" );
throw;
}
FORMAT関数のほうがCONVERT 関数より使いやすいです
SELECT FORMAT(GETDATE(),'yyyyMMdd')
,FORMAT(GETDATE(),'yyyy/MM/dd')
,FORMAT(GETDATE(),'yyyy/MM/dd HH:mm:ss')
-----------------------------------------------------
20180531
2018/05/31
2018/05/31 10:05:23
SELECT CONVERT (date, getdate())
,CONVERT(NVARCHAR, getdate(), 112)
-----------------------------------------------------
2018-05-31
20180531
非コミット読み取り(READ UNCOMMITTED)
コミット済み読み取り(READ COMMITTED)
再読み込み可能読み取り(REPEATABLE READ)
直列化(SERIALIZABLE)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
トランザクションの開始を宣言します(これがないとロックしません)
BEGIN TRANSACTION
COMMIT
ROLLBACK TRANSACTION
デフォルトのロックのタイムアウト時間を調べます
SELECT @@lock_timeout AS default_lock_timeout;
-1 の値が返ってきたときはタイムアウトしません(恐ろしい...)
ロックのタイムアウト時間を 30秒 に設定する
SET LOCK_TIMEOUT 30000
msec で指定するので30秒にセットするときは 30000 になります。
排他ロックは通常 INSERTやUPDATEなどの更新処理のタイミングでかかりはじめます。 SELECTをする時からロックを開始したいときは明示的にロックをかけます
select max(ID) AS maxid from MY_TABLE WITH(XLOCK);
WHERE句が来るときは位置に注意
select * FROM MY_TABLE WITH(XLOCK) WHERE ID = 5 ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
SELECT * FROM EV100TL
ROLLBACK TRANSACTION
https://github.com/2mas/SelectNextOccurrence
インストール後に「ツール」→「オプション」→「キーボード」からショートカットを登録すれば使えるようになります。
https://marketplace.visualstudio.com/items?itemName=OmarRwemi.LinePress
using System.Text.RegularExpressions;
matchedObject.Success の true または false でマッチしたかどうかを判別し、
マッチした文字列は matchedObject.Groups 配列から取り出します
string Url = "http://google.co.jp/";
Match matchedObject = Regex.Match(Url, @"https?://google(.+)");
if ( matchedObject.Success)
{
var country = matchedObject.Groups[1].Value;
}
.NET Core 2 でTwitter API を叩きたいときは Tweetinvi を使うといいでしょう。(CoreTweetではなく。)
Visual Studio からパッケージを「Tweetinvi」で検索してインストールするか
Install-Package TweetinviAPI
コマンドでインストールします。
Auth.SetUserCredentials("CONSUMER_KEY", "CONSUMER_SECRET", "ACCESS_TOKEN", "ACCESS_TOKEN_SECRET");
Tweet.PublishTweet("Hello World!");
(以降、Auth は省略します)
var status = Tweet.GetTweet(999226655250956288);
DateTime date = DateTime.Now;
DateTime dt = DateTime.Now;
var d1 = dt.ToString( "yyyyMMdd" );
var t1 = dt.ToString( "HHmmss" );
20180528
120559
var start_str = "20180215131723";
DateTime dt = DateTime.ParseExact(start_str, "yyyyMMddHHmmss", new CultureInfo("ja-JP"));
オブジェクト同士なら 比較演算子( > や = など)で比較できます
.NET Coreでは基本 Entity Framework を使用するので直接SQL文を実行する事はありませんが、たまにSQL文を実行したい時があります。 Entity Frameworkを使用するので簡単な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);
非クエリ コマンドに対して Database.ExecuteSqlCommand を使用します。
DBにテーブルを構築後モデルファイルを自動で生成するにはプロジェクトフォルダ( .sln ファイルがあるディレクトリの1つ下の階層)から PowerShell を立ち上げ、次のようにコマンドを入力します
コマンド の書き方
dotnet ef dbcontext scaffold <connection_string> <provider>
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
-f オプションで上書きします。(一番最後に -f をつけて実行します)
dotnet ef dbcontext scaffold "Server=データベースサーバ名;Database=ScaffoldDB;Trusted_Connection=True" Microsoft.EntityFrameworkCore.SqlServer -o Models -f
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
</ItemGroup>
dotnet restore
を実行すると dotnet ef コマンドが使用できるようになります。
引用 : https://qiita.com/TsuyoshiUshio@github/items/f45700dc2e95e7c3992a
appsettings.json
"MySettings": {
"KEY": "hogehoge",
"SECRET": "fugafuga",
}
「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; }
}
}
}
using <あなたのプロジェクト名>.Models;
using Microsoft.Extensions.Options;
を先頭に追加し、次のメソッドを書き換え
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<AppSettings>(Configuration);
}
using <あなたのプロジェクト名>.Models;
using Microsoft.Extensions.Options;
を先頭に追加し、次のプライベート変数とコンストラクタを追加
private readonly AppSettings appSettings;
public HomeController(IOptions<AppSettings> optionsAccessor)
{
this.appSettings = optionsAccessor.Value;
}
以上でコントローラーの各メソッドで this.appSettings から appsettings.json の値が参照できます。
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
HogeController.cs
public IActionResult Fuga()
{
ViewData["Message"] = "メッセージの表示テストです";
return View();
}
Fuga.cshtml
<h2>@ViewData["Title"]</h2>
デバッグを実行してブラウザのアドレス欄に http://localhost:50914/Hoge/Fuga と入力して移動すると
<h2>メッセージの表示テストです</h2>
が出力されます。
「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>
(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(確認画面 - ビュー) テンプレート cshtml の一番上でモデルのクラスを指定します。
@model <プロジェクト名>.Models.<モデルのクラス名>
例
@model Myapp.Models.Entry
<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 をセットします。
チルダ ~ でドキュメントルートを参照できます。
<img src="~/Content/hoge.gif" alt="サンプル画像" />
コードファーストでDBとコントローラーを作成します。
「ソリューションエクスプローラー」→「/Models」を右クリック → 追加 → 「クラス」(モデルの名前を入力して「追加」)
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; }
}
Visual Studioの「パッケージマネージャー コンソール」から
Add-Migration Initial
Update-Database
(または PowerShellから同様のコマンドを実行することができます。Mac、Unixの場合はこちら)
dotnet ef migrations add Initial
dotnet ef database update
「ソリューションエクスプローラー」→「/Controllers」を右クリック → 追加 → 「コントローラー」 →「Entity Frameworkを利用したビューがあるMVCコントローラー」(モデルクラスを選択して「追加」)
「f5」でアプリを実行し
http://localhost:50914/Movies
へ移動し動作を確認する。
SQL Serverへのログインはデフォルトでは Windows認証となっていますが、
ユーザーとパスワードをしていすればログインできる「SQL Server認証」でログインできるようにしてみます。
Microsoft SQL ServerManagement Studio を起動して次のようにします。
「セキュリティ」→「ログイン」を右クリックして「新しいログイン」を選択する
・「ログイン名」を入力する
・「SQL Server認証」を選択する
・「パスワード」「パスワードの確認入力」を入力する
・「パスワードポリシーを適用する」のチェックを外す(簡単なパスワードを許可したい場合)
・「既定のデータベース」、使用したいデータベースを選択
・「既定の言語」、 Japanese を選択
・「ユーザーマッピング」ページへ移動し操作したいデータベースの横にある「マップ」のチェックボックスのチェックをつける
・操作したいデータベースを選択し、下の画面の「db_owner」にチェックをつける
サーバー名を右クリック → プロパティ → 「セキュリティ」を選択 →「SQL Server認証モードとWindows認証モード」を選択 → OK
SQL Server 構成マネージャー から SQL Server を再起動する
Microsoft SQL ServerManagement Studio を起動して 「SQL Server認証」 を選択し先ほど入力したIDとパスワードでログインできることを確認する。
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"
},
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>
# 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
その際以下の認証機能を追加します
・メニューの「新規作成」→「プロジェクト」→「ASP .Net CORE MVCアプリケーション」で【OK】を押す。
・「Webアプリケーション(モデル ビューコントローラー)」「認証の変更」「個別のユーザーアカウント」を選択して【OK】を押す。
これでプロジェクトファイルとソースコード一式が生成されます。
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;
パッケージマネージャーコンソールから
Update-Database
と入力します。
PowerShellを開き、プロジェクトがあるディレクトリに移動してから
dotnet ef database update
と入力します。
以上です。
ローカルで動作することを確認します
(10GBまで無料の SQL Server 2017 Express をインストールします) https://www.microsoft.com/ja-jp/sql-server/sql-server-editions-express
https://go.microsoft.com/fwlink/?linkid=870039
せっかく マルチプラットフォーム対応の .NET Core なのでデータベースをMS以外のものに変更してみます。
– Microsoft.EntityFrameworkCore.SQLite
– Microsoft.EntityFrameworkCore.SQLite.Desgin
Startup.cs の以下を書き換えます
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
↓ 「UseSqlServer」を「UseSqlite」に変更する
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
}
SQLServerの場合は接続文字列がセットされていますが、そこを ファイル名に変更します。
"ConnectionStrings": {
"DefaultConnection": "Server=MYPC\\SQLEXPRESS;Database=test_user_auth_db;Trusted_Connection=True;MultipleActiveResultSets=true"
},
↓
"ConnectionStrings": {
"DefaultConnection": "Filename=./mydata.db"
},
Update-Database
これでアプリを実行すると SQLiteを使ってユーザー認証アプリを作成することができます。
https://docs.microsoft.com/ja-jp/ef/core/providers/sqlite/limitations
指定したディレクトリに .zip ファイルが生成されます。
https://www.microsoft.com/net/download/windows
.zip ファイルや 発行先ディレクトリの入力を求められるので入力します。
PowerShellを立ち上げて、該当ディレクトリに移動した後で次のコマンドを入力 (例: アプリ名が HelloWorld01 の場合)
dotnet HelloWorld01.dll
組み込みサーバが立ち上がるので表示されるアドレスを入力して動作を確認します。 (確認後 Press Ctrl+C でサーバを終了。)
以上です。 手動のデプロイも簡単です。
Explorer で該当ディレクトリに移動しアドレス欄に powershell と入力して実行すると、該当ディレクトリをカレントディレクトリとして立ち上がります
Set-ExecutionPolicy RemoteSigned
New-item –type file –force $profile
notepad $profile
ファイルが開くのでエイリアスを追加して保存する
Set-Alias g git
Set-Alias l Get-ChildItem
PowerShell を再起動するとエイリアスが使えるようになっています。
https://github.com/PowerShell/Win32-OpenSSH/releases
(64bit版、32bit版どちらもあるのでお使いのサーバ用の zip ファイルをダウンロード)
c:\openssh\
に置きます。
・「Windowsアイコンを右クリック」→「システム」をクリック
・「システムの詳細設定」→「環境変数」をクリック
・「システム環境変数」の 「Path」 を選択して「編集」をクリック。
・「追加」を押して「C:\openssh」を追加
Power Shellを起動して以下を実行します
cd \openssh
.\install-sshd.ps1
New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSH
Power Shellを起動して以下を実行します
Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic
再起動後に他のマシンからssh接続を確認します。