あるアプリのサーバー側を.NET Coreで作ってAzureにホストしているのですが、.NET Coreのバージョンを1.0から1.1にしてみました。Visual Studioは2015です。

インストール

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

ここで、.NET Core 1.1 SDK – InstallerとVisual Studio 2015 Tools (Preview 2)をダウンロードしてインストール。

ファイルの書き換えとパッケージのアップデート

global.jsonのversionを書き換え。

{
  "projects": [ "src", "test" ],
  "sdk": {
    "version": "1.0.0-preview2-1-003177"
  }
}

project.jsonの下記2カ所。

"Microsoft.NETCore.App": {
  "version": "1.1.0",
  "type": "platform"
},
"frameworks": {
    "netcoreapp1.1": {

Package Manager Consoleで

PM> Update-Package

そうすると、
変更前

{
  "title": "Hoge",
  "version": "1.0.0",
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.1",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.AspNetCore.Cryptography.KeyDerivation": "1.0.0",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
    "Microsoft.AspNetCore.Mvc": "1.0.1",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
    "Microsoft.EntityFrameworkCore": "1.0.1",
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0"
  },
  (後略)

{
  "title": "Hoge",
  "version": "1.0.0",
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.1.0",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.1.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.1.0",
    "Microsoft.Extensions.Configuration.Json": "1.1.0",
    "Microsoft.Extensions.Logging": "1.1.0",
    "Microsoft.Extensions.Logging.Console": "1.1.0",
    "Microsoft.Extensions.Logging.Debug": "1.1.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0",
    "Microsoft.AspNetCore.Cryptography.KeyDerivation": "1.1.0",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
    "Microsoft.AspNetCore.Mvc": "1.1.1",
    "Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
    "Microsoft.EntityFrameworkCore": "1.1.0",
    "Microsoft.EntityFrameworkCore.SqlServer": "1.1.0",
    "Microsoft.AspNetCore.StaticFiles": "1.1.0"
  },
  (後略)

アップデート後は、Microsoft.EntityFrameworkCore.Tools以外は1.1.xになっています。

EntityFramework Core関連

Package Manager Consoleで

PM> Update-Package Microsoft.EntityFrameworkCore.Tools -Pre

これで、

"Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final"

アップデートされます。

Azureへの発行

ちょっとはまってしまったのですが、発行時にTargetFrameworkをちゃんと1.1を選んでおかないと、pubxmlの設定が1.0のままになるらしく、サーバーに発行する段階でエラーが出ます。

deploy.png

Xamarinをちょっと触っているのですが、Macを新しくしたらWindows側のXamarin Mac AgentからMacにログインできなくなりました。

20170113_macagenterror

ネットワークとかMacのSharing設定ではなく、なんかライセンスを承認してないとか言うエラーです。でもMac側では普通にXcodeも使える状態ですので調べてみたら、

Xamarin.iOS 10.0.0.6: Mac Agent can’t connect after update

Solution:

  1. Go to Xcode -> Preferences -> Location
  2. Check if “Command Line Tool” set
  3. Run sudo xcodebuild -license in terminal
  4. Follow instructions

こう言うのがあったので試してみいたら接続できるようになりました。

そういえば、Xcodeをインストールする前にCommandlineToolsを入れたような記憶があるのでそれのせいかもしれません。

タブレットで動かすWPFアプリケーションでは、ソフトウェアキーボードを制御できないので、適宜テキストボックスフォーカス時などに、c:\Program Files\Common Files\microsoft shared\ink\TabTip.exeを呼び出すようなことになります。

で、たまたまその仕組みを使っていたアプリケーションを改修していたところ、ソフトウェアキーボードが出ないようになってることに気がつきました。Anniversary Updateのせいみたいです。

調べてみたところ、HKEY_CURRENT_USER\SOFTWARE\Microsoft\TabletTip\1.7にEnableDesktopModeAutoInvokeというキーを作って、DWORD値を1にすれば良いと言うことだったので試してみたら表示されるようになりました。

Show touch keyboard (TabTip.exe) in Windows 10 Anniversary edition

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の再インストールなども不要。
« Prev