Как я могу создать Fluent NHibernate Convention, которая игнорирует свойства, которые не имеют сеттеров - PullRequest
4 голосов
/ 23 августа 2010

Я ищу FluentNH (Fluent NHibernate) соглашение или конфигурацию, которая игнорирует все свойства, которые не имеют установщика:

Это все равно отобразит это:

public class foo{
  public virtual int bar {get; private set;}
}

И пропустите это:

public class foo{
  public virtual int fizz{get;private set;}
  public virtual int bar{get {return fizz;}} //<-------
}

Ответы [ 4 ]

7 голосов
/ 23 августа 2010

Вы должны использовать пользовательскую конфигурацию сопоставления

public class DefaultMappingConfiguration : DefaultAutomappingConfiguration
{
    public override bool ShouldMap(Member member)
    {
        return member.CanWrite;
    }
}

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

var nhConfiguration = new Configuration().Configure();
var mappingConfiguration = new DefaultMappingConfiguration();

var.fluentConfiguration = Fluently.Configure(nhConfiguration );
    .Mappings(m => m.AutoMappings.Add(
        AutoMap.AssemblyOf<MappedType>(mappingConfiguration)
    ));

var sessionFactory = this.fluentConfiguration.BuildSessionFactory();

Однако частные сеттеры не будут сопоставлены. Вы должны получить их как защищенные

3 голосов
/ 11 сентября 2010

Используйте это:

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

        return base.ShouldMap(member);
    }
}

Это должно относиться к случаю отсутствия сеттера и приватного сеттера.

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

Другой способ - использовать атрибут.

public class MyEntity
{
    [NotMapped]
    public bool A => true;
}

public class AutomappingConfiguration : DefaultAutomappingConfiguration
{
    public override bool ShouldMap(Member member)
    {
        if (member.MemberInfo.GetCustomAttributes(typeof(NotMappedAttribute), true).Length > 0)
        {
            return false;
        }
        return base.ShouldMap(member);
    }
}
0 голосов
/ 19 ноября 2011

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

public override bool ShouldMap(Member member)
{
    var prop = member.DeclaringType.GetProperty(member.Name);
    bool isPropertyToMap = 
        prop != null &&
        prop.GetSetMethod(true) != null &&
        member.IsProperty;

    return
        base.ShouldMap(member) && isPropertyToMap;
}
...