複数のシステムからアクセスされるデータベースがあります。私たちのものは、Fluent Nhibernate と Automapping を使用してテーブルを読み取ります。
列の 1 つは、列挙型を表す文字列です。ほとんどのインストールではこれで問題ありませんが、別のシステムで無効な値が保持されることがあります。これらの無効な値をキャッチして、変換または無視するにはどうすればよいですか?
例:
Database Table:
ID MyEnum
0 "One"
1 "Two"
2 "Invalid"
MyEnum
{
One,
Two
}
私はすでにIAutoMappingOverride
自分のモデルで使用していますが、マッパーに関数を渡して検証/変換を行う方法はありますか (未知数を に変換したいとしますMyEnum.One
)? または、私が見逃しているより簡単な方法はありますか?
私がたどり着いたのは、 @ Firoの回答とこことここの回答の組み合わせを使用することでした
class SafeEnumType<T> : ImmutableUserType where T : struct
{
public override object NullSafeGet(IDataReader rs, string[] names, object owner)
{
T value;
if (Enum.TryParse((string)rs[names[0]], out value))
return value;
else
return default(T);
}
public override void NullSafeSet(IDbCommand cmd, object value, int index)
{
NHibernateUtil.String.NullSafeSet(cmd, value.ToString(), index);
}
public override Type ReturnedType
{
get { return typeof(T); }
}
public override SqlType[] SqlTypes
{
get { return new[] { SqlTypeFactory.GetString(100) }; }
}
}
と追加
mapping.Map(x => x.Type).CustomType(typeof(SafeEnumType<EventType>));
私のAutomapOverride.Override()
fnへ