2012-02-10 1 views
0

Я провел пару дней, чтобы познакомиться с рабочей моделью 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. Но настраиваемый атрибут, который определенно установлен, не будет обнаружен. Почему это!?
В методах конвенции я часто использовал тот же подход и там он отлично работает. Почему свойство не может обнаружить определенные атрибуты здесь, когда это очевидно в настройке соглашения. Есть ли обходной путь?

ответ

2

Вы добавили свой новый автопарк в Automap?

AutoMap.AssemblyOf<>(new CustomAutomappingConfiguration()) 

Update: вы получаете атрибут пропуска булева класса вместо свойства

member.PropertyType.GetCustomAttributes(typeof(SkipMap), false) 

должен быть

member.MemberInfo.GetCustomAttributes(typeof(SkipMap), false) 
+0

Да! Я предполагаю, что вы имеете в виду automapCONFIGURATION. У меня также есть несколько соглашений, но все они работают нормально и не должны влиять на эту проблему. –

+0

Спасибо! Я действительно пропустил это редактирование. Но сегодня один из моих коллег обнаружил одно и то же, поэтому я просто пошел сюда, чтобы обновить сообщение с помощью этой простой настройки. MemberInfo вместо PropertyType сделал разницу! –

0

Чтобы убедиться, что пользовательский атрибут применим к свойствам, попробуйте добавить [AttributeUsage(AttributeTargets.Property)] в ваш класс SkipMap.

Другая возможность - это столкновение имени атрибута с другим атрибутом, который применяется к различным целям. Попробуйте переименовать класс на что-то вроде MyVerySpecialSkipMap и повторите проверку, чтобы убедиться, что у вас нет столкновения атрибута. По крайней мере, напишите некоторый простой код отражения, чтобы проверить атрибут SkipMap вне контекста вашего приложения, чтобы убедиться, что его можно найти.

+0

Спасибо за ваш ответ! Я добавил декларацию использования атрибута и не вызвал никаких жалоб. –

+0

Я изменил название, как было предложено, но без какой-либо разницы. Свойства с этим атрибутом по-прежнему отображаются в хранилище. Это может быть ошибка в FluentNHibernate? Должен ли я сообщить об этом где-нибудь? –

+0

Я попробую устранить неполадки, создав простой проект, в котором содержится только класс SkipMap, чтобы код отражения проверялся на обнаружение свойства. Если это не работает в простом проекте, проблема может быть в Fluent NHibernate. –

Смежные вопросы