Свободный NHibernate ShouldMap не обнаруживает мой пользовательский атрибут - PullRequest
0 голосов
/ 10 февраля 2012

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

Ответы [ 2 ]

2 голосов
/ 19 апреля 2012

добавили ли вы новое автоконвенция в Automap?

AutoMap.AssemblyOf<>(new CustomAutomappingConfiguration())

Обновление: вы получаете атрибут пропуска из логического класса вместо свойства

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

должно быть

member.MemberInfo.GetCustomAttributes(typeof(SkipMap), false)
0 голосов
/ 29 марта 2012

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

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

...