Entity Frameworkのアソシエーション

Entity Frameworkで親子関係のアソシエーションを張ろうと思ったら張れなかった話です。対象テーブルのフィールドは下記。

  • 明細データ
主キー 明細番号 オートナンバー
伝票番号  
行番号  
商品コード  
  • 伝票データ
主キー 伝票番号 オートナンバー
得意先コード  

今回は明細データ単独で処理したいこともあるので、行番号ではなく明細番号を主キーにして伝票番号で伝票データと繋げます。これをEntity Frameworkでアソシエーション付けて触ろうと設定したのですが、伝票番号同士で設定ができないのです。まぁ明細データ側の伝票番号がエンティティキーでは無いので当然といえば当然なんですが、なぜか後輩は設定できたと。

確認したところバージョンが関係していたようでFrameworkのバージョンが自分は3.5、後輩は4.0でした。
ツールボックスからアソシエーションを選択、2つのテーブルに紐付け、表示された線をダブルクリックで表示されるダイアログが微妙に違っていました。

  • 3.5

f:id:redseen:20140206171745j:plain

  • 4.0

f:id:redseen:20140206171731j:plain

プリンシパルキーと紐付けできるのが「依存キー」と「依存プロパティ」と違っており、依存プロパティは全ての項目が選択可能に対し、依存キーはエンティティキーのみの選択しかできません。おそらく外部キーつけろよで話が終わるのだと思いますが、うちの会社はデータベースをただの入れ物としてしか使わず、外部キー文化がありません。今回はFrameworkの制約があるので仕方なくこのまま行くことにします。

eclipseでWinMergeを使用して変更内容を表示する

今回はeclipseの話。
社内のsvn環境に合わせチームプラグインSubversive SVN コネクターを使用しています。

Eclipse Subversive - Subversion (SVN) Team Provider

修正前後のソースを比較する場合[比較]->[作業コピーからベース]で見るのですが、このエディタが非常にわかりづらく嫌だったので使い慣れたWinMergeで表示するように設定しました。

WinMerge 日本語版

以下、手順です。

  1. 設定の[チーム]->[SVN]->[Diffビューアー]を開く。
  2. 画面右側の追加ボタンをクリックし[ファイル関連付けパラメーターの追加]ダイアログを開く。
  3. [拡張子またはmime型]に*(アスタリスク)を入力する。
  4. [Diff プログラムの引数]の[プログラム・パス]にWinMergeのパスを入力する。(パス中にスペースがあるせいで、前後をダブルコーテーションで括る必要がありました。)
  5. [プログラム・パス]の下のテキストボックスに「-e -ub -dl "変更前" -dr "現在" "${base}" "${mine}"」と入力する。
  6. [OK]で閉じる。

f:id:redseen:20140121150156p:plain

以上、これで使い慣れたWinMergeを使用することが出来ました。

WCFの転送量

MVCの仕事はまだ来ません。なのでその間に別の仕事の対応をやっているわけですが。

このシステムはWCFサービスをサーバーに置き、地図を利用したWindowsアプリとAndroidアプリが場所(座標)を追加したり編集したりするんですが、どうも起動時に場所を読み込んでくる部分が遅く気になっていました。もちろん稼働当初より数は増えているので当然の話しかもしれませんが、それを差し引いてもモッタリ感が強くて。

正直原因は転送量なんだろうなと予想はついていました。
場所データの公開はEntity経由のRESTサービスでビューを丸々公開しています。Windowsアプリはサービス参照で、Androidアプリは自作ライブラリでこのデータを利用するわけですが、このデータ取得の転送量がえらいことになってました。JSONでも7M、XMLに至っては倍の15Mほどでした。ぎゃー。

これはマズイっしょということで現在修正中なのですが原因をいくつか。

ユニークURLが勝手に付く

配信されるデータ全てにユニークURLがつきます。これがハンパな量じゃない。結局その部分を何にも使うわけではないので無駄以外の何物でもありません。

漢字の使用

社内にはデータベースのテーブル名、フィールド名に漢字を使う傾向があります。これに関しては全く異論は無くむしろ支持派です。シンボリックだと本来の意味に置き換える脳内変換の時間や、資料を漁らないとわからないという無駄な時間ができてしまうので。でもこれが仇となってエンコードされた文字列がこれまた半端じゃない量で降ってしまうわけです。

余計な項目まで降っている

ビューとして使用しているので条件だけに使用したい項目も含まなければいけず、それを丸々公開してるもんで降ってからの処理には使わないものまで降らしています。これも無駄。

改行コード、空白の付加

JSONには付いてないようでしたが、XMLの場合改行コード2バイトと意味不明の空白が付加されています。これもまたすごい量。Minifyが当然、セミコロンの1バイトも圧縮する時代に雑すぎるでしょ、みたいな。


以上が原因。これを解決するためにやること。

WEBメソッドの利用

WEB API使えよってツッコミは無しで。きちんと配信に必要な項目だけのクラスを作成してDataMember属性のNameで限りなく項目名を短くします。さらに場所の名称や漢字の使用されているような項目は排除しキー項目、経度緯度ぐらいにして、名称等の情報は必要なときにまた引くことにします。たくさん引いてもクリックされて内容を見られるのは僅かなのでこれでも大丈夫そうです。これでユニークURL、漢字、余計な項目はなくなります。そしてSOAP通信にすることによって無駄な改行、空白は抑えられます。

参照にしか使用することがないビューはADO.NET Data Servicesでの公開は向いていない・・・というかやったところで嬉しい部分が実は少ないかなと感じました。というわけで修正続けます。

HTML5関係の学習

ASP.NET MVCは標準でHTML5マークアップになります。プロジェクトテンプレートにはBootstrapとjQuery関係のスクリプトが入ってきます。

HTML5の学習

HTMLクイックリファレンス

タグに関しては色々なサイトを見ながら少しづつは見ていましたが今回は技術書を購入しました。こちらのサイトで知って読みましたがいろいろな疑問が解けました。
今までhtml(ドキュメント、文書)とcss(デザイン)は別個だという認識は当然ありましたが、どっちが強い・・・というか、表現が難しいのですがhtmlはcssを意識して書かなければいけないのか、はたまたその逆なのかイマイチわからないでいました。ですがこの本を読んでその疑問が無くなりました。他にもコンテンツモデル、カテゴリーの概念、ドキュメントアウトラインの重要性など基本的なことが理解でしました。

jQuery、Bootstrap、LESSの学習

Bootstrap
LESS « The Dynamic Stylesheet language
今日からはじめる!Twitter Bootstrap 3入門 〜Webデザイナーのための簡単サイト構築術〜 | Find Job ! Startup
jQueryに関しては今まですいません、逃げてきた部分もあるので本を購入しました。現在読んでいる途中です。
BootstrapはTwitterが出してるCSSフレームワーク(っていうのか?)で、これを学習中にLESSに出会いました。なんでも「CSSを出力するためのメタ言語」だそうで。LESSファイルを記述してコンパイラがそれをCSSに変換してくれます。.NETで言ったらT4みたいな感じでしょうか。実は3つ目のサイトを見ながらやってたんですが結構内容が端折ってあって若干戸惑いました。LESSのコンパイルの部分とか。
これらを使った仕事のスタートはもう少し先になりそうですが2014年に加速しそうな技術を学習できたいい時間でした。

ASP.NET MVCの学習

仕事でWEBの仕事が来そうなんで、当然時代はMVCっしょってことでこの年末の開いた時間にASP.NET MVCを勉強。部分的に動かしたことはあったもののこうやってじっくりと勉強したことは無かったです。環境はVS2013、Framework4.5、希少種のVBですw

以下やったこと。

ASP.NET MVCチュートリアル

Getting Started with EF 6 using MVC 5 : The Official Microsoft ASP.NET Site
Getting Started with ASP.NET MVC 5 : The Official Microsoft ASP.NET Site
MVC Music Store : The Official Microsoft ASP.NET Site

MSDNにあるMVCチュートリアル3本。3本めはMVC3でよりショッピングサイトに近いような内容です。サイトは英語ですが機械翻訳でもなかなかの精度でなんとか意味は伝わってきたので問題は少なかったです。チュートリアル自体はC#なもんでVBに写経しながらやるわけですがRazor構文が一番苦労しました。なかなかVBの構文を解説しているところが見つからず時間がかかりました。

認証部分

新しい認証の仕組み ー ASP.NET Identity | どっとねっとふぁん
ASP.NET Identity を読み解く | どっとねっとふぁん
ASP.NET Identity プロファイルの追加 | どっとねっとふぁん
ASP.NET Identityカスタマイズに挑戦 - かずきのBlog@hatena

認証部分はこのお二人のサイトを参考にさせていただきました。ログインは欠かせない機能なのでキチンとフレームワーク側で提供してくれているのにもかかわらず、自力でやってしまうようなアホなことを今までやっていたので力を入れて勉強しました。
小野さんのところではテンプレートに入ってくるIdentity認証の拡張方法、かずきさんのところでは認証なしのアプリに独自クラスを利用した認証処理の実装を学びました。
小野さんが記事中で仰っている「メールアドレスをユーザー名として使うことができない」って部分はUserValidatorクラスのAllowOnlyAlphanumericUserNamesプロパティで解決できました。

CType(Me._UserManager.UserValidator, UserValidator(Of AppUser)).AllowOnlyAlphanumericUserNames = False

ここまでやってやっぱり気になるのは、HTML5と標準で入ってくるBootstrapやjQueryなわけで、そっちの方も改めて勉強(中)しました。それはまた次回。

2014年始動

明けましておめでとうございます。本日より仕事始め、2014年始動の日です。ちょっと思うところがあって、はてなダイアリーからブログへ引っ越しました。テストを兼ねてご挨拶投稿です。本年もよろしくお願い致します。

2013/12/26のツイート