当鯖ではDBにMySQLを使っており、ORマッパーとして Fluent NHibernate を使ってます
だけど、残念なことにFluent NHibernateについて日本語の情報がほとんどありません
需要がないんだろうなぁ( °_°) と思いつつ自分が思うことをいろいろ書いてみます
Fluent NHibernateとは
大本に Hibernate というJavaのORマッパーがあって、これを.NETに移植したものが NHibernate になります
Hibernateはかなり枯れたプロダクト。ですが、歴史がある分動作は安定しています(たぶん)
NHibernateの設定は、ORマッピング定義を含めすべてXMLファイルで作成する必要があります。これがなんとも面倒でその難解さも相まって導入の障害になっていました
これをソースコード上でできるようにしたものがFluent NHibernateです
設定の例
// DB接続のファクトリクラス private static readonly ISessionFactory _factory; static DB() { // メソッドチェーンで設定 var config = MySQLConfiguration.Standard .ConnectionString(x => x.FromConnectionStringWithKey("DB")) .IsolationLevel(IsolationLevel.ReadCommitted); _factory = Fluently.Configure().Database(config) .Mappings(x => x.FluentMappings.AddFromAssemblyOf<MvcApplication>()) .BuildSessionFactory(); }
Entity Frameworkを使わない理由
.NETで作成するアプリケーションのORマッパーは公式に Entity Framework が推奨されています
これはWindows鯖(IIS)+SQL Server環境での親和性が非常に高く、機能をフルに使うことが可能です
ですが、当鯖の環境はLinux+Monoです
当初はEntity Frameworkを検討していましたが、どうしてもMono上で実行時にエラーが発生してまともに動きませんでした
ですが、Monoによると 動作します と書かれているので、今思うとやり方がまずかったのかもしれません…?
もう1つの問題としてEntity Frameworkでのトランザクションは TransactionScopeクラス 前提になっていて、TransactionScopeはMono(というかLinux)上では動作しません。正確には MS DTCサービス が稼働している必要があります
無理矢理コネクションを引っ張り出してトランザクションを制御することも可能ですが、スマートではないですね
追記
Entity Framework 6ではすでに TransactionScope は非推奨になってるようです…
実際に使ってみて
正直、安定動作まで持って行くのにかなり大変でした(汗
やはり、日本語のドキュメントがほとんど無いことが致命的です。英語のドキュメントを読む労力が必要です
CakePHPとかFuelPHPのお手軽MVCに慣れているとヒントが少なくてキツいかもしれません
そう考えると選択肢の多いPHPがなんとも魅力的に見えます。ですが、当鯖はLinux+Monoです(意地)
大変なのは設定だけなのでそれさえできればOKですかね。なお、パフォーマンスは あまり良くない 模様…
やる気があれば、Fluent NHibernateの中核であるマッピング機能について書きたいと思います
4件のコメント
#01
megane
お疲れ様です。
先週、しばらくアクセスできへんなぁ~と思ってましたww
先週は、プライベートな都合により有給とりまくりで
実家に寄せていたので、なにかネタあるかな~って思って。
#02
管理人
有給いっぱい取れるんだったらまだ会社としては良さそうですね
以前に勤めていたある会社では有給+休出の代休で40日以上ありましたが、退職時の買い取りもなくうやむやにされてしまいました
トラが開幕3連勝。奇跡ですね
#03
megane
休みを取らせてくれるのは本当に今の職場の人たちはありがたいです。
正直、有給を全部消化しろ的な労組が強いわけではないけど、
自分の周りは専門職だから、そこんところはドライですよね。
阪神、どないしたんですかねぇ…
でも、開幕戦は負けるかと思いました。
#04
管理人
エンジニアのための時間管理術 という本にこう書いてありました
自分も同意見です。megane氏の会社は健全そうですが、会社に休暇を取ることがはばかられる雰囲気が漂っているのであれば本当に残念なことです