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