FluentNHibernate - свойство игнорирования Automapping - PullRequest
2 голосов
/ 01 июня 2009

У меня есть базовый класс, который содержит свойство IsDirty. Это используется для модели домена и не является столбцом в таблице базы данных.

При использовании автоматического отображения, свободный nhibernate пытается добавить этот столбец в таблицу. Чтобы это исправить, нужно ввести .ForTypesThatDeriveFrom<Address>(p => p.IgnoreProperty(x => x.IsDirty)) в настройку автоматического определения.

Проблема в том, что все мои сущности будут делать это, есть ли способ заявить об этом без необходимости добавлять эту строку для каждой сущности? Если я поставлю .ForTypesThatDeriveFrom<Entity>(p => p.IgnoreProperty(x => x.IsDirty)), то получаю сообщение об ошибке при попытке преобразовать сущность в адрес.

У меня также есть сущность, установленная в качестве базового типа.

Спасибо заранее, JT

Ответы [ 3 ]

8 голосов
/ 14 апреля 2012

Вы создаете класс, полученный из DefaultAutomappingConfiguration, и переопределяете метод ShouldMap(Member member).

Вот так:

public class AutoMapConfiguration : DefaultAutomappingConfiguration
{
    private static readonly IList<string> IgnoredMembers = new List<string> {"IsNew", "IsDeleted"};

    public override bool ShouldMap(Member member)
    {
        return base.ShouldMap(member) && !IgnoredMembers.Contains(member.Name);
    }
}

и тогда ваша конфигурация будет выглядеть примерно так:

Fluently.Configure()
    // Database settings
    .Mappings(m => {
        m.AutoMappings.Add(yourMappingAssembly, new AutoMapConfiguration())
    });
1 голос
/ 30 июня 2009

У меня была такая же проблема, за исключением того, что NHibernate жаловался на отсутствующий класс.

Я полагаю, что вы можете использовать следующее соглашение для удаления части, которая отображает свойство из класса:

public class IgnorePropertiesClassMapConvention : IClassConvention
{
    public bool Accept(IClassMap classMaps)
    {
        return true;
    }
    public void Apply(IClassMap classMap)
    {
        var partsToIgnore = classMap.Parts.OfType<IProperty>()
            .Where(IgnoreProperty).ToList();

        foreach (var part in partsToIgnore)
            ((IList<IMappingPart>)classMap.Parts).Remove(part);

    }

    private bool IgnoreProperty(IProperty property)
    {
        // Your logic would be here
    }
}

Код, который я использовал, немного отличается, поскольку мне нужно было удалить отображение ManyToOne:

public class IgnorePartsBasedOnReturnTypeClassMapConvention : IClassConvention
{
    public bool Accept(IClassMap classMaps)
    {
        return true;
    }
    public void Apply(IClassMap classMap)
    {
        var partsToIgnore = classMap.Parts.OfType<IManyToOnePart>()
            .Where(IgnorePart).ToList();

        foreach (var part in partsToIgnore)
            ((IList<IMappingPart>)classMap.Parts).Remove(part);

    }
    private bool IgnorePart(IManyToOnePart part)
    {
        return IgnoreProperty(part.Property);
    }

    private bool IgnoreProperty(PropertyInfo propertyInfo)
    {
        var ignoredNamespaces = new []{"namespacesToIgnore"};
        return ignoredNamespaces.Any(namespc => propertyInfo.GetGetMethod().ReturnType.Namespace.StartsWith(namespc));
    }
}

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

0 голосов
/ 30 мая 2019

OverrideAll, кажется, подходит, если вы не определяете свою конфигурацию.

Fluently
    .Configure()
    .Mappings(x => x.AutoMappings.Add(AutoMap.AssemblyOf<MyEntity>(mapConfig)
            .OverrideAll(ign => ign.IgnoreProperty("MyPropertyToBeIgnored"))
                ))

Источник: https://bernardorezende.wordpress.com/2011/12/12/ignore-property-mapping-with-fluent-nhibernates-automapping-model/

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