Entity Frameworkは以前から興味があって、隙間を見つけてどういう風に使って、どういう風に動くのか調べてたのですが、途切れ途切れになったままCoreになってしまったので、また試してみました。

大体データベースを扱う場合は、何らかデータがリレーションしていたりして、親子になってるテーブルなんかは普通に出てきます。そういうのを単純なモデルにするとこうなります。

public class Order
{
    public int OrderId { get; set; }
    public DateTime OrderDate { get; set; }

    public List<OrderDetail> OrderDetails { get; set; }
}

public class OrderDetail
{
    public int OrderDetailId { get; set; }
    public stirng ProductCode { get; set; }
    public int Amount { get; set; }

    public int OrderId { get; set; }
    public Order Order { get; set; }
}

これで、Order-OrderDetailで親子になるようなテーブルができてくれます。
データをセットするときは、

var context = SampleDbContext();

context.Order.Add(
    new Order
    {
        OrderDate = DateTime.Now,
        OrderDetails = new List<OrderDetails>
        {
            new OrderDetail
            {
                ProductCode = "A001",
                Amount = 1
            }
        }
    });

context.SaveChanges();

こんな感じで普通にC#でオブジェクトを扱うようにすれば、よしなにしてくれます。
データを取得する場合は、

var context = SampleDbContext();

var orders = context.Orders;

foreach (var order in orders)
{
    Console.WriteLine($"{order.OrderId},{order.OrderDate}");
    foreach (var detail in order.OrderDetails)
    {
        Console.WriteLine($"{detail.ProductCode},{detail.Amount}");
    }
}

とかやると、もうSQLのことを何も考えず、JOINとか気にする必要なくデータが出る……と思いきや、order.OrderDetailsの中身がnullになっててエラーになります。
前やってみたときはこれでさくっと出て、いたく感動したものですが、なんか思った通りに行きません。モデルもきわめて単純だし、データをのぞいてみてもちゃんと入ってるのに……

で、回答はここにありました。

Part 2. Entity Framework Core 1.0 の基本的な使い方

こちらの下の方にある「Lazy Loadingの廃止」というところが参考になりました。

前に行けていたように思えていたのは、Lazy LoadingでEFがあとから引っ張ってきてくれていたおかげなんですね。

var orders = context.Orders
    .Include(o => o.OrderDetails);

こうすると子のデータも取れるようになりました。
もしOrderDetailがさらにリストを持っているような場合は、

var orders = context.Orders
    .Include(o => o.OrderDetails)
        .ThenInclude(d => d.DetailSubItems);

みたいに、ThenIncludeをつないでいくことになります。

また、Orderが複数のリストを持つような場合は、

var orders = context.Orders
    .Include(o => o.OrderDetails)
        .ThenInclude(d => d.DetailSubItems)
    .Include(o => o.Items);

みたいにして、Includeを繋げれば取ってこれます。

Entity Frameworkについてはググると以前のバージョンについての話と、Coreについての話がぱっと見てわかりづらいのでなかなか調べるのもなかなか大変ですね。

Windows10の1607が公開されましたが、Windows Updateで落ちてくる気配がなかったので、VMWare Fusionで使っているWindows10環境を手動でアップデートしたところ、VMWareのファイル共有が効かなくなりました。

Windowsに限らず、VMWareを使っていると時々あることで、そういう場合は何らかの原因でVMWare Toolsがちゃんと動いていないケースがほとんどですので、VMWare Toolsを再インストールとかしてみれば大丈夫なんですが、今回それではダメでした。

ちょっと調べてみたら、共有フォルダが使えなくなる原因は下記の理由みたいです。

3. Re: Shared Folders – Windows 10 upgrade from 15.11.

この書き込み自体は去年末のWindows10-1511のアップデートの時にされたものですが、内容としては「Windowsのアップデートによって、ネットワーク関連のレジストリ設定から、VMWareのファイル共有プロトコルが消えてしまう」ことにあるみたいなので、もしかしたら今回も同じかも知れないと思って、確認してみましたら、確かにvmhgfsというのが無い状態でした。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order
Name: ProviderOrder
Type: REG_SZ
Data: "RDPNP, LanmanWorkstation,webclient"

Modify to:
Data: "vmhgfs,RDPNP, LanmanWorkstation,webclient"

ということで、先頭にvmhgfsを追加したらすぐに反映されるようになりました。
レジストリ操作にありがちな、再起動/ログオフなどは不要です。
VMWare Toolsの再インストールも不要です。

この書き込みの人は、この共有ファイル機能を担当している開発者みたいで、そりゃもうどんぴしゃな答えですよね。

まとめ

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order
  • ProviderOrderの値に”vmhgfs”が無ければ、それを先頭に追加する。
  • 再起動やログオフ不要、すぐに反映される。
  • VMWare Toolsの再インストールなども不要。

最近gitの2.8.0がリリースされましたので、作業環境のmacに入っているgitを更新することにしたんですが、3/31現在https://git-scm.com/のダウンロードでは2.6.4が落ちてきます。

なので、Homebrewで更新してみました。

$ brew install git

とりあえずこれでインストールされますが、以前本家サイトのインストーラーで入れたものが有効になっていて、

$ git --version
git version 2.6.2

ってことになってしまいますので、

$ which git
/usr/local/bin/git

で場所を確認して、

$ ls -la /usr/local/bin | grep git

とやると、git関連のコマンドが、/ust/local/git/binにリンクされてることがわかります。
Homebrewでインストールしたものは、/usr/local/Cellar/git/2.8.0にありますので、このリンクを張り替えてやればいいんですが、これもbrewでできます……が、すでにリンクが存在するとエラーになるようです。

$ brew link git
Linking /usr/local/Cellar/git/2.8.0...
Error: Could not symlink bin/git
Target /usr/local/bin/git
already exists. You may want to remove it:
  rm '/usr/local/bin/git'

To force the link and overwrite all conflicting files:
  brew link --overwrite git

To list all files that would be deleted:
  brew link --overwrite --dry-run git

とりあえず強制的にリンクを上書きする、ってことで、

$ brew link --overwrite git

として、やっと

$ git --version
git version 2.8.0

となりました。

ソース管理にGitLabを使っていて、サブディレクトリで動く設定にしていますが、この設定、結構面倒くさいんです(ファイル4つ書き換える)。また、アップデート後のreconfigureでこの設定がなくなってしまい、gitlab.rbでも指定できないみたいなので、いつも手作業です。

さらに、GitLabは毎月確実にアップデートされていて、細かいリリースは逐次行われるので、うかうかしていると新しくなりすぎていてバージョンアップできるかどうかを結構気にしないといけないことにもなります。アップデート自体はyumでやってくれるんですが、サブディレクトリ設定は毎回ちゃんとやり直さないといけないのが大変です。

で、先ほどGitLabを最新にして、いつも通りにサブディレクト利用の設定を書き換えていたら、設定方法が変わってました。

基本的には、gitlab.yml,unicorn.rb,config.yml,application.rbの4つに手を入れるんですが、application.rbにあるはずの「config.relative_url_root = “/gitlab”」のコメント行がなくなっていました。

調べてみたら、Install GitLab under a relative URLこう言うことみたいです。

application.rbの設定は、relative_url.rbというファイルに書かないといけなくなったみたいですね。relative_url.rb.sampleには、「config.relative_url_root = “/gitlab”」と書いてあるので、このファイルが有効になっていれば読み込まれると言うことでしょう。

まとめるとこんな感じになります。(/gitlabで動かす場合)

cp /opt/gitlab/embedded/service/gitlab-rails/config/initializers/relative_url.rb.sample \
   /opt/gitlab/embedded/service/gitlab-rails/config/initializers/relative_url.rb

vim /var/opt/gitlab/gitlab-rails/etc/gitlab.yml
    relative_url_root: /gitlab のコメントアウト外す

vim /var/opt/gitlab/gitlab-rails/etc/unicorn.rb
    ENV['RAILS_RELATIVE_URL_ROOT'] = "/gitlab" を追記

vim /var/opt/gitlab/gitlab-shell/config.yml
    gitlab_url: "http://localhost:8080/gitlab" に書き換え

iOSの開発なんかもちょっと面倒を見ないといけなくなったこともあり、作業環境がMac Book Proになりました。これまでほとんど触ったことはなかったのですが、やっと慣れてきました。
ベースがunixなだけあって、PHPとかWebが関連するようなものを扱う場合は非常に便利ですね。Web系の人たちがみんなMacを使っているのもよくわかります。

現在に至るまでの最大の難関はキーボードでした。

ながらくWindowsで、キー配置を少しカスタマイズして使ってきたこともあり、体に染みついている動きを変えるのは困難……というか不可能だったので、カスタマイズ不可欠です。特に、修飾キー周りは、Control,Option,Commandが全くなじめません。へんてこりんな記号が未だに覚えられません。
キーボードは愛用している外付けのもの(FILCOのMinira)でMac用のキートップではないので、ショートカットキーで「(上矢印)(クローバーみたいなやつ)G」みたいな表示をされても、いったいどれなんだかわからない……

さらに、環境がMacになったとはいえWindows系の仕事もあるので、VMWareFusionを使って、仮想のWindows環境での作業もありますので、今まで通りの操作ができないと結構厳しいです。

で、あれこれ試行錯誤した結果、

  • キーボードのdepスイッチでctrlとcapsを入れ替え
  • Macの修飾キーを設定を変更
  • Karabinerを使って一部キーをカスタマイズ
  • VMWareの環境設定
  • VMWare上のWindowsの「のどか」で右AltをToggleIME

という風にして、ストレスのない環境ができました。

キーボードのdepスイッチでctrlとcapsを入れ替え

FILCOのキーボードは、depスイッチで一部のキー配置を変更できますので、ctrlとcaps入れ替えをonにします。
この設定は、Windowsの時は「のどか」でやっていました。

Macの修飾キー設定を変更

keyboard

Windowsで言うCtrl+なんとかな操作が、Macだと軒並みCommand+なんとかになってしまい、キーの位置が非常に使いづらいですね。
なので、Macの環境設定で、ControlとCommandを入れ替えます。あと、Caps LockはVMWare上のWindowsでややこしい動きをするので、アクションなしにしています。

Karabinerを使って一部キーをカスタマイズ

Karabinerは、かなり細かくいろいろカスタマイズできますが、カスタマイズしたのは2つだけ。

  • Option_RをKana Eisuu
  • VMWareの時にCommand_LをControl_Lにする

Option_RをKana Eisuu

Windowsの時に、「右AltをIME ON/OFF」にしていた設定を再現しています。
外付けキーボードの右AltがMacだとOption_Rになるので、これで同じ動作をしてくれます。

VMWareの時にCommand_LをControl_Lにする

ややこしいんですが、Aの左にあるやつの設定です。
Macの修飾キー設定で「Aの横はCommand」になっているんですが、このままだとWindows環境の時に、「Aの左がCtrl」になってくれないので、VMWareの時にはまた元に戻す、ってことになります。

VMWareの環境設定

VMWareの環境設定-キーボードとマウスで、

  • キーマッピングの「キーマッピングを有効にする」「言語固有のキーマッピングを有効にする」をオフに。→ここでもカスタマイズはできそうだけど、特に必要ない。
  • Macホストショートカットで「Windowsキーでは、以下を使用」を「右コマンドキーにする」→キーボードに右コマンドキーはないので、実質「Windowsキーをなくす」設定

Windows側の「のどか」設定

で、最後にWindowsに入れてある「のどか」でRightAltをToggleIMEにする。
(ほかにもいくつかカスタマイズはしているけど、Windows上だけの話で特に関係ない)

おしまい

こんな感じで、今までと同じような感覚で操作ができるようになりました。

ただ、一点だけどうしようもないのが、Macの「Command+h」。
これを押すと、最前面のアプリが最小化されるみたいなんですが、このショートカットはかなり深いところで設定されているらしく、カスタマイズする方法が見つからないのです。かろうじて、「ヘルプが出るようにすればアプリは最小化されないよ」みたいなのが見つかったんですが、コレジャナイ感満載……

Windows、特にMicrosoft系のアプリケーションだと、Ctrl+hは置換のショートカットで、上記カスタマイズを行った環境で置換操作をしようとすると、画面が突然消えるのです。何でこいつだけこんな特別扱いなんですかね。

« Prev Next »