自動採番されるIdの値を綺麗に取得する方法ですの。

(例)
var entity = new Entity();
context.Add(entity);
context.SaveChanges();
int n = entity.Id;

SaveChanges()した時点でentity.Idが書き換えられて、自動採番された新しい行の数値が入るので、それをそのまま取得することが出来ますの。

参考
[C#-ADO.NET] Entity Framework で IDENTITY 列を持ったテーブルに行を挿入した時の IDENTITY 列の値の取得
https://code.msdn.microsoft.com/DataAccess-howto-383a3202

はじめ全然わからなくて、1日はまりましたの。
「entity framework SCOPE_IDENTITY()」で検索したらあっさり上のページが見つかったので、検索も発想力が大事だと思ったのですの。その前に地力があれば良いのかもですけど。

自動マイグレーションが出来ないということは、 手動でする必要があるということですの。

やり方は、パッケージマネージャーコンソールで、
Add-Migration piyo
して、
Update-Database
すれば大丈夫ですの。

ちょっとめんどうなのは、(現在のバージョンでは)piyoの部分は毎回変える必要があるということですの。変更ごとに記録を作っていく感じですの。

↓過去のバージョンでは、-Force オプションで上書き保存が出来たようですの。
EF Migrations Command Reference
https://coding.abel.nu/2012/03/ef-migrations-command-reference/ 

↓現在のバージョンのオプション
EF コア パッケージ マネージャー コンソール ツール
https://docs.microsoft.com/ja-jp/ef/core/miscellaneous/cli/powershell

開発中に何度もモデルを変更して、大量にマイグレーションファイルが出来てしまうのは嫌なので、なにか方法があればと思ったのですけど。自動マイグレーションの削除といい、柔軟さ・開発速度の追求よりは、やや堅い方向に進んでいるのかなと言う気がしますの。


参考

EntityFrameworkのMigrationを試してみる 
https://cfm-art.sakura.ne.jp/sys/archives/307

EF Core automatic migration
http://weblog.afsharm.com/2017/09/ef-core-automatic-migration/

Entity Framework Core 2.0 以降では、自動マイグレーションの機能は削除されていて、今後も追加される予定はないそうですの。

自動マイグレーションやってみたかったのですけど、出来ないんじゃしかたないですの。

一つのビューで複数のモデルを扱う方法について。
結局、専用クラスを作るのが一番簡単なようですの。部分ビューを使う方法もあるそうなのですけど、これはよくわからなかったですの。

本当はTupleが使えればよかったのですけど、残念ながら、@model~の型定義はTupleに対応していないそうですの。(将来対応する予定?)


@model does not support the C# syntax for tuple #1592
https://github.com/aspnet/Razor/issues/1592

図書館<本棚<本 という構造を、Controllerから渡してViewで処理をする場合。

Viewでは以下のようにしますの。

@model IEnumerable<プロジェクト名.Models.図書館>
@foreach (var 本棚 in Model.本棚s){
    @foreach (var 本 in 本棚.本s){
         @Html.DisplayFor(x => x.書名)
    }
}

※Controllerから送られた情報は、Modelというオブジェクトに入っている決まりで、「@model~」は、そのオブジェクトの型の指定ですの。(*1)


Controllerのほうでは、以下のようにしますの。

public async Task Index(){
    return View(await _context.図書館
        .Include(x => x.本棚)
        .ThenInclude(x => x.本)
        .ToListAsync());
}


ここで少しわかりにくいのが.Include()で、これは「関連オブジェクトの内容も一緒に読み込むための指定」ですの。逆に言うと、これをしないとViewで本棚sの内容を見ようとしたときにnull例外が出ますの。(*2)

同様に、.ThenInclude()は「関連オブジェクトの関連オブジェクトの内容も一緒に読み込むための指定」ですの。例では孫オブジェクトの指定に使っているけれども、ひ孫オブジェクトの指定でも同様に繋げていけばいいはずですの。たぶん。

ちなみに、.ThenInclude()での指定時は、VisualStudioのバージョンによっては、正しく指定していても構文エラーの表示がされることがあり、その場合は無視して良いそうですの。

VS2017で試したところでは、エラーにはならなかったけどコード補完は上手く効いていないようでしたの(=「x.」まで打っても候補に「本」が出てこなかったですの)。

参考

UWPでEntity Framework OneToMany
http://blog.okazuki.jp/entry/2016/03/12/093957

関連データの読み込み
https://docs.microsoft.com/ja-jp/ef/core/querying/related-data


*1) ただの型指定なので、「@model~」の記載自体で情報を受け取っているわけでは(たぶん)無いですの。

*2) 本棚sがnullなのか、本棚の内容がnullだったのかは未調査ですの。ただ、foreachで回そうとしたときに落ちたので、たぶん、本棚sごとnullになるのだと思いますの。

ASP.NET Core でMVCしようとするとお世話になるのが、Entity Frameworkですの。
2007年に、.NET framework 3.5で標準ライブラリに組み込まれたということで、思ったよりも古いもののようですの。

1つのPOCO(Plain Old CLR Object)なクラスで、1つのエンティティ(テーブル的なもの)を表現しますの。

POCOなエンティティクラスは、以下のように
public class Hondana {
    public int Id {get; set;}
    public string Code {get; Set;}
}
シンプルな形で定義しますの。(プロパティの定義はたぶん必要?)

本棚テーブルに対して、そこに入る本テーブルを作って使いたいような場合は、ちょっと謎だったのですけど、以下で大丈夫ですの。

他のエンティティを配下に持ちたい場合(1対nで繋げたい場合)、
public virtual ICollection Hon {get; Set;}
のように、相手の情報をコレクションで持って、

相手方には、自分の情報を持たせますの。
public virtual Hondana Hondana {get; set;}

お互いにコレクションで持ち合うと、n対nの関係が作れますの。


参考

連載:Entity Framework 4.1入門
第2回 EF 4.1の規約とデータベースの初期化方法
http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4codefirst02/ef4codefirst02_01.html

public void なにか言う(string s, Action say) => say(s);
public void 言う(string s) => print(s);

public void ぴよって言う()=> なにか言う("ぴよ", 言う);

ぴよって言う()の中身の通り、なにか言う()は出力用の関数を外部からもらう形になっているので、言う()では無い関数を渡すことで、出力先や方法などを容易に変えることが出来ますの。(例えば、ファイルに出力するなど)

ちなみに、値を返さない関数の型はAction、返すものはFuncと書くそうですの。ここではActionを使う例のみ。

名前も微妙に長いしなぜわけたのですの。ぜんぶ、F<>でよかったような。

Actionの場合はまだいいけれど、Funcで「関数を返す関数」を返す、をやりはじめると定義が長くなりがちなので、なるべく短く書ける記法を用意しておいて欲しかったですの。

(あとで思ったけど、たしかにFuncだけだと値を返さない場合を表現しきれないので、わけるのはしょうがなかったのかもですの)