2012/08/08

【C#】コードファーストでくだらないミス

いやぁー、参りました。ここ2、3日コードファーストからデータベースが作成できなくてモデルとにらめっこしてました。また、忘れて同じ事しないようにメモっとく。

原因1

テーブルAとテーブルBを複合外部キーを利用してリレーションしてやろうと思ってモデル側に「ForeignKey」属性をつけてみたんだけど、どうやら複数指定できない模様。じゃぁFluentAPIか?と思ってDbModelBuilder.Entity<>().HasRequired().WithMany().HasForeignKey()ってのを見つけたけどこれまた複数指定の方法がないっぽい。
…う~ん。複数指定ができないなら複合型を使ってモデル側でフィールドをまとめちゃえばできなくはないかって気はするけど、外部キーにしたいからって複合型使うのってどうなんだろ?
結局のところ、とりあえず複合外部キーはあきらめてIDを振ってそれを外部キーにすることにしました。フィールドにIdとは異なるコードとかあるからごちゃごちゃするの嫌だったんだけどしょうがないか。

原因2

原因1を解決して、さぁ今度こそデータベース作成しちゃうぞって思った矢先に「System.NotSupportedException Message=PrimitiveType 'SByte' の概念側の型 'Edm.SByte(Nullable=True,DefaultValue=)' に対応する格納型がありません。」なんてよく分からんエラーが…。
これ、原因言っちゃうと「string型をsbyte型にしてた」っていう馬鹿なタイプミスなんですど、これにたどり着くまでこれまた馬鹿みたいに時間食っちゃいました。だってsbyteなんて馴染みがなさすぎて…。まぁエラー自体、そんな型使えませんよ的なエラーだったからもっと早く気がつくべきだったんでしょうけどsbyte自体馴染みが無かったもんで…。散々悩んでソース内を検索してみたら一発でタイプミスの箇所が出てきてかなりショックでした。

てな感じで困った数日間でした。原因1に関してはもうちょと整理できたら複合型も考えてみてもよいかもって気もします。


pagetop