Свободное автоматическое сопоставление NHibernate с абстрактным базовым классом - PullRequest
7 голосов
/ 09 мая 2011

Учитывая классы ниже:

public class Address : Place
{
    public virtual string Street { get; set; }
    public virtual int Number  { get; set; }


    public override string WhereAmI
    {
        get { string.Format("{0} {1}", Street , Number); }
    }
}
public abstract class Place : DomainEntity
{
    public abstract string WhereAmI { get; }
}

Когда я использую это отображение:

var autoMap = AutoMap.AssemblyOf<Party>()
            .Override<Place>(map => map.IgnoreProperty(p => p.WhereAmI))
            .Override<Address>(map => map.IgnoreProperty(p => p.WhereAmI))
            .Where(type => type.Namespace != null && type.Namespace.Contains("Models"));

Я все еще получаю сообщение об ошибке: Не удалось найти установщик для свойства 'WhereAmI' в классе 'Address'

То, что я сделал:

  • Когда я удаляю свойство из базового класса "Address", оно работает.
  • Когда я использую .OverrideAll (map => map.IgnoreProperty ("WhereAmI")) Но я не хочу, чтобы он был глобальным, потому что в другом классе я мог бы использовать то же имя свойства, где я действительно хочу включить это свойство

Есть ли способ заставить это работать, кроме как использовать интерфейс?

1 Ответ

4 голосов
/ 11 июля 2012

Я попытался отследить в коде FluentNHibernate именно то, почему IgnoreProperty, кажется, ломается, когда игнорируемое свойство приходит из базового класса, но истекло время.Кажется, работает нормально, если свойство get-only не исходит от базового класса.

В любом случае, решение вашей ситуации, по-видимому, заключается в создании пользовательской IAutomappingConfiguration путем наследования от DefaultAutomappingConfiguration.См. Ответ на переполнение стека: Как создать Fluent NHibernate Convention, в которой игнорируются свойства, у которых нет сеттеров .

Вот пользовательская конфигурация автоматического преобразования, которую я успешно использовал для автоматизации примера объектаВы указали:

protected class CustomConfiguration : DefaultAutomappingConfiguration
{
    public override bool ShouldMap (Member member)
    {
        if (member.IsProperty && member.IsPublic && !member.CanWrite)
        {
            return false;
        }

        return base.ShouldMap(member);
    }

    public override bool ShouldMap(Type type)
    {
        return type.Namespace != null && type.Namespace.Contains("Models");
    }
}

И затем его использование:

var autoMap = AutoMap
            .AssemblyOf<DomainEntity>(new CustomConfiguration());

Обратите внимание, что предложение Where в вашем примере должно было перейти в пользовательский класс конфигурации, поскольку его нельзя использовать в цепочке, еслиВы используете пользовательский экземпляр конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...