Fluent NHibernate の自動マッピングの作業モデルを理解するために、ここ数日を費やしてきました。これは非常に素晴らしいことですが、スキーマに欠落している新しい詳細を検出し続けています。クラスに追加のプロパティを追加したいのですが、それらをデータベースにマップしたくありません。典型的なケースは、内部ロジックを持つ追加のプロパティが必要な場合です。
そのため、例を読み、StackOverflow をスキャンしたところ、これは追加する別の規則ではなく、DefaultAutomappingConfiguration を継承して ShouldMap メソッドをオーバーライドするという問題であることがわかりました。
わかりました、問題ありません。1 分後、次のような結果が得られました。
public class CustomAutomappingConfiguration : DefaultAutomappingConfiguration
{
public override bool ShouldMap(Member member)
{
var explicitSkip = member.PropertyType.GetCustomAttributes(typeof(SkipMap), false).Length > 0;
if ((member.IsProperty && !member.CanWrite) || explicitSkip)
{
return false;
}
return base.ShouldMap(member);
}
}
/// <summary>
/// Don't map this property to database.
/// </summary>
public class SkipMap : Attribute
{
}
public class DemoClass
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual MyBitwiseEnum Status { get; set; }
public virtual bool IsValid
{
get
{
return (int)Status > 3;
}
}
[SkipMap]
public virtual bool IsBad
{
get
{
return MyBitwiseEnum.HasFlag(MyBitwiseEnum.Bad);
}
set
{
MyEnum = value ? MyBitwiseEnum | MyBitwiseEnum.Bad : MyBitwiseEnum ^ MyBitwiseEnum.Bad;
}
}
}
私のデモクラスがちょっとばかげていることは知っていますが、それは私の要点を説明するものです.
アイデアは、データベースにマップするプロパティを手動で決定したいということです。
ShouldMap メソッドは property.CanWrite を検索するため、readonly プロパティは正常に機能します。ただし、必ず設定されているカスタム属性は検出されません。何故ですか!?
慣習的な方法では、私は同じアプローチを頻繁に使用しており、そこではうまく機能します。規約設定では明らかに検出できるのに、ここでプロパティが定義済みの属性を検出できないのはなぜですか。回避策はありますか?