如何创建一个忽略没有setter的属性的Fluent NHibernate约定

时间:2010-08-23 11:19:52

标签: c# fluent-nhibernate nhibernate-mapping conventions

我正在寻找一个忽略所有没有setter的属性的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 个答案:

答案 0 :(得分:7)

您应该使用自定义映射配置

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();

但是,私有的setter不会被映射。你应该把它们作为受保护的

答案 1 :(得分:3)

使用此:

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

        return base.ShouldMap(member);
    }
}

那应该处理没有setter和private setter的情况。

答案 2 :(得分:0)

我知道这是一个老问题,但下面的代码与私人制定者有关。

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;
}

答案 3 :(得分:0)

另一种方法是使用属性。

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);
    }
}