Я потратил пару дней на то, чтобы познакомиться с рабочей моделью автоматического флюптинга Fluent NHibernate.Это довольно хорошо, но я продолжаю обнаруживать новые детали, отсутствующие в моих схемах.Теперь я хочу добавить дополнительные свойства в мои классы, но не сопоставлять их с базой данных.Типичный случай, когда мне нужны дополнительные свойства с внутренней логикой.Поэтому я прочитал примеры и отсканировал StackOverflow и обнаружил, что это не было еще одним соглашением, которое нужно добавить, а скорее вопросом наследования DefaultAutomappingConfiguration и переопределения метода ShouldMap.Хорошо, без проблем, через минуту у меня было что-то вроде этого:
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;
}
}
}
Я знаю, что мой демонстрационный класс немного глуп, но он проиллюстрирует мою точку зрения.Идея заключается в том, что я хочу вручную решить, какие свойства сопоставить с базой данных.Свойство readonly работает нормально, потому что метод ShouldMap будет искать свойство property.CanWrite.Но пользовательский атрибут, который определенно установлен, не будет обнаружен.Это почему!?В конвенционных методах я часто использовал один и тот же подход, и там он отлично работает.Почему свойство не может обнаружить определенные атрибуты здесь, когда это, очевидно, может в настройке соглашения.Есть ли обходной путь?