Fluent NHibernate/フルーエントマッピング/NOT NULL
Fluent NHibernateで「NOT NULL」を用いる方法、およびその際の注意事項について。
目次
エンティティ
エンティティにおける見どころは、Memoプロパティにおいてnull合体演算子を用いて、string型が絶対にnullを返さないようにしているところ。
これを書いていてC#にnull許容型ではなくnull排除型が欲しいと思った。そんなものはない。
public class ForeverNote
{
public long Id { get; protected set; }
private string _memo;
public string Memo
{
get { return _memo ?? "" }
set { _memo = value ?? "" }
}
}
マッピング
マッピングにおける見どころは、「Not.Nullable()」としている箇所と、「Default("")」としている箇所である。
「Not.Nullable()」は見たままなので問題ないと思う。 この指定によりデータベース側のテーブルのカラムにNOT NULL属性が付く。
問題は次の「Default("")」のところ。 個人的にハマったのが、これを指定しておけばエンティティ側のプロパティがnullのときに、デフォルト値として入力してくれるだろうなと期待していたが、世の中そんなに甘くなく実行時にエラーとなって残念賞となった。
おかげでC#の自動プロパティを全部普通のプロパティに書き換えるというクソ面倒な作業が発生しましたとさ。やっぱりC#にnull許容型ではなくnull排除型が欲しいと思った。そんなものはない。
public class ForeverNoteMap : ClassMap<ForeverNote>
{
public ForeverNoteMap
{
Id(x => x.Id)
.GeneratedBy.Identity();
Map(x => x.Memo)
.Length(1048576)
.Not.Nullable()
.Default("");
}
}
関連項目
参考文献