Entity Framework コードファーストとビューの扱い

いつのバージョンからなのかわからないけれど、ADO.NET.Entity Data Model が「新しい項目の追加」ダイアログボックスのテンプレートに追加されている。
これを使うと、既存のデータベースからコードファーストに必要なモデルを一式作成してくれる。
したがって、以後は次のようにすると良いのかもしれない。

1.コードファーストでさっくりとデータベースとテーブルを作ってあげるためのプロジェクトを作成
2.作成後のデータベースにビューなどを追加
3.必要に応じてテーブルやビューを変更したりする

実際のシステムを開発する場合は、DataModel なりのフォルダを切って、ここに ADO.NET.Entity Data Model からコードファーストモデルを作る。
マイグレーションの度に、DataModel フォルダ以下を削除して、再度 ADO.NET.Entity Data Model からコードファーストモデルを作る

これがベストな解かどうかはわからないけれど、ビューも管理できるし、しばらくはこれでいこうかな

null条件演算子の使い道

調べものをしていたら、以下のサイトの記事が目に留まってしまった。

http://qiita.com/tadnakam/items/a42d320f2bb19c69a004
C# 6.0 新機能まとめ(qiita)

この以下の部分

>4 Null条件演算子
>?. という演算子が追加されたそうです。null 以外のとき、値を変換するなどに使えそうですが、使う機会は少なそうです。

とありましたけど、自分は使った経験が何度かあったので気になりました。

?.演算子は、??演算子とセットで使用すると大変便利です。

if (r == null) {
    a = 0;
    b = "";
}
else {
    a = r.A;
    b = r.B;
}

の場合に、次のように書くことができます。

a = r?.A ?? 0;
b = r?.B ?? "";

r が null の時は、null と評価されるので ?? 演算子の右辺のオペランドが有効になるのですね。

 

電力自由化における停電リスク

http://gendai.ismedia.jp/articles/-/48576

停電は多発しない筈です

電力自由化で新電力会社と契約するのは電力購入に関してだけで、家に電力を届けるための託送供給契約は今まで通り電力会社とします

したがって、この記事による停電の原因となるのは、電力の供給体制の量を超えた受電要求が起きた場合に限られる訳です

各人が新電力会社から購入した電力は、スマートメーターによって電力会社が管理し、新電力会社にデータを報告することで請求がなされています

つまり、新電力会社は、電力会社が所有する送電網に、どれだけ電気を入れたか、どれだけ電気を出したかをメーターで管理して仕入と売上としており、売上が仕入を上回った差分は電力会社から購入したことになる訳です

以上から、電力供給量の全体の不足分は電力会社が発電して調整することがわかるのですが、この仕組みって今まで通りな訳で、新電力会社が損をするかどうか(電力会社から新電力会社への電力の売価は、めちゃくちゃ高いので)だけの話です

ちなみに電力会社が、不足分の電力の責任を担うことの損害は、恐らくですが、総括原価方式によって解決するのだと思います
最新のものはわかりませんが、僕の知っている限り最新の電力改革法案に総括原価方式による価格の設定は残すとありました
この分の負担は、あくまで新電力会社への売価で設定するのみなのか、我々一般受給者にも関わってくるのかはわかりません

以上のことから、電力の自由化は必ずしも競争原理が働いて電力料金が安くなるとは言い切れないと僕は思っています

最後に、電力会社の責任と特権についてです
東電が東京電灯としてスタートする前の時代、電力会社の数は数百社ほどありました
当時は停電が多発し、感電事故や、電圧の変化による火災なども多発したため、規制や法を厳しくするとともに、これを厳守することができる現在の電力会社に絞られた歴史があり、そういった過去の教訓から、電力会社が特権を持つことは、とても自然なことだと僕は思います

WPF の DatePicker の値が格納されているプロパティ

入力系のコントロールで多用される TextBox の癖でつい下記のように書いてしまう。

<DatePicker Text="{Binding Path=Regist}"/>

最近は、生産性をあげるために、最初からまとめてコードを一気に書きあげてしまう。
そして、その後に、まとめて動作を確認する。
なので、上記の場合 Regist に値が渡らなかったり、内部的に設定した日付が反映されなかったりで軽くデバッグする羽目になってしまった。

正しくは以下です。

<DatePicker SelectedDate="{Binding Path=Regist}"/>

値を取得するプロパティ名は別名でも良いから統一して欲しいなぁ・・・

WPF でマウスカーソルを待機状態にする

MainWindow に次のコードを書いておきます。

		public void WaitCursor(bool flag) {
			if (flag) {
				Cursor = Cursors.Wait;
			}
			else {
				Cursor = null;
			}
			DoEvents();
		}


		public void DoEvents() {
			DispatcherFrame frame = new DispatcherFrame();
			Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(ExitFrames), frame);
			Dispatcher.PushFrame(frame);
		}

		public object ExitFrames(object frames){
			((DispatcherFrame)frames).Continue = false;
			return null;
		}

MVVM パターンなどで、VMから制御したい場合は、次のようにするとよいです。

		static public void WaitCursor(bool flag) {
			var me = App.Current.MainWindow as MainWindow;
			me.WaitCursor(flag);
		}

待機状態のマウスカーソルは、処理が重くなる場合が多く、DoEvents を自作してメッセージキューを処理させています。
メインウィンドウのメソッドを簡潔に呼び出すために、App.Current.MainWindows で取得したアプリケーションの MainWindow インスタンスから、自身のアプリケーションのメインウィンドウの型に変換しています。

de:codeで見るべきオススメ動画

http://nnasaki.hatenablog.com/entry/2014/06/07/203742
de:codeで見るべきオススメ動画4つ #decode14 – nnasakiのブログ

この紹介記事が、とてもわかりやすいのでお薦めです。
私も、ここで紹介されている4つの動画を見終えたところです。
—–

http://channel9.msdn.com/Events/de-code/2014/Keynote

Technical Keynote Developers build the Future

伊藤かつらさんによるキーノートです。
ソフトウェア開発技術者でなくても、IT業界に関わる方には是非見て欲しいと思います。
IT業界がどのように動いていて、今の状況はどのようになっているのか、マイクロソフトがどこに向かおうとしているのかがわかるようになっています。

—–
http://channel9.msdn.com/Events/de-code/2014/TL-005
ジニアス流! SQL Server 2014 アプリ開発の極意

ジニアス平井さんのセッションです。
この方のセッションは、とても人気があってアンケートの結果でも高得点を出しているくらいに魅力的なものが多いのですが、今回のセッションも素晴らしいものでした。
さりげなくデモで自作しているアプリケーションに注目です。

—–
http://channel9.msdn.com/Events/de-code/2014/DE-007
iOS/Android アプリを C#/.NET で開発 – Xamarin で実現するクロスプラットフォーム対応 –

本当に C#/.NET で開発できてます。
Visual Studio は、もはやマイクロソフト系のプラットフォームで動作するアプリケーション統合開発ツールという枠を超えているんですね。

—–
http://channel9.msdn.com/Events/de-code/2014/TL-001
この 10 年をキャッチアップ! .NET 開発者のための技術選択と「いま」

松崎さんにしては珍しい、レベル200のセッションです。
ここでは、この10年を振り返りながら、.NET の今と今後についてを言及しています。

ここで気になるキーワードとして「WPF」「MVVM」「Entity Framework」があります。
特に今後は、マルチプラットフォームで動作させることが可能になってくるので、View と Logic の分離をしっかりしておかないと、後で泣くことになります。

実は、http://blogs.bitlan.net/ito/?page_id=736で紹介している拙著「ひと目でわかるMicrosoft Visual C# 2013/2012アプリケーション開発入門」で実際に、これらのテクノロジーを使用してアプリケーションを開発する手順を紹介しています。

以上、結局は自分の書籍の宣伝でした。

実行中のファイルを取得する

実行中のファイル名をフルパスで取得する必要があったので、この場にもメモしておきます。

var p = System.Reflection.Assembly.GetExecutingAssembly().Location;

System.Reflection 名前空間の Assembly クラスは、拙著で「ひと目でわかるMicrosoft Visual C# 2013/2012アプリケーション開発入門」でバージョン情報ダイアログボックスを表示するときに使用したものです。

このクラスの GetExecutingAssembly メソッドから取得できる Assembly が、現在実行中のアセンブリになります。
このインスタンスの Location プロパティからファイル名を取得することができます。

なお「現在実行中のアセンブリ」は、必ずしも実行ファイル(Exe 形式のファイル) だけを返す訳ではありません。
例えば、アセンブリが肥大することを嫌って、機能ごとにプロジェクトを分けている場合は、当然実行中のアセンブリは dll 形式になることもあります。
従って、上記コードを実行するアセンブリを意識して使用する必要があります。

LINQ to…

以下のコードを実行すると q の遅延実行時に例外エラーになります。
考えてみれば当たり前なのですが、書いてから気づくことがよくあります。

Func where = x => x.Piyo == value;
var q = DataContext.Hoges.Where(x => where(x));

Hoges の件数が少ないことがわかっていれば、以下のように ToList() なりを入れて Object 化してから判定する程度で良いんでしょうけど、そうでないときは、Dynamic LINQ を使うのがいいのかな?

Func where = x => x.Piyo == value;
var q = DataContext.Hoges.ToList().Where(x => where(x));

簡潔に書けるだけに、つい深く考えずに書いてしまいます。

Entity Framework のコードファーストでエンティティクラスを継承したときの注意

今気づいたんですが、エンティティクラスを継承したクラスを変更しても、マイグレーションしろと言われるんですね。
例えば、こんな感じです。

class Hoge{
    public int Piyo{ get; set; }
    public int Fuga { get; set; }
}

class HogeHoge : Hoge {
}

class DatabaseContext : DbContext {
    public DbSet<Hoge> Hoges { get; set; }
}

この場合、HogeHoge クラスは DbSet 対象ではないので、データベース生成後に HogeHoge クラスを変更しても問題ないと思っていました。
しかし、 HogeHoge クラスにプロパティを追加すると、次の例外が表示されます。

>The model backing the ‘DatabaseContext’ context has changed since the database was created. Consider using Code First Migrations to update the database

軽く注意しておく必要がありそうですね。

情報を素早くアウトプットするための工夫

自分の頭の中にある情報を素早くアウトプットするための工夫をまとめてみます

性能の良いキーボード
ストレスなく動作するPC
テンプレートによる量産化と省力化
頭に浮かんだ内容をメモできるテキストエディタ
指の移動を少なくするためのキーアサインの変更
コマンド起動時のショートカットの活用
マウスもしくは代替となるデバイスの検討

一応、自分が気づいて取り入れてるものは列挙してみたけど、他にもあったら教えて下さい。