【问题标题】:How can I create a Fluent NHibernate Convention that ignores properties that don't have setters如何创建一个 Fluent NHibernate 约定,忽略没有设置器的属性
【发布时间】:2011-04-02 14:23:45
【问题描述】:

我正在寻找一个 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;}} //<-------
}

【问题讨论】:

  • +1 有趣的问题。我通常只创建一个 getter 方法:GetBar(),它还可以让用户更清楚地了解它的意图(但这当然不是解决您的问题的方法)。
  • @Abel 这是可以接受的解决方法。

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


【解决方案1】:

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

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

但是,私有设置器不会被映射。你应该让它们受到保护

【讨论】:

  • 这省略了带有private set;的道具。
  • +1:简单,很好,并且应该使用 FluentNH 完成(但删除描边的第一行......;)。 PS:请注意,CanWrite 在有私人 setter 时返回 false(我认为)。
【解决方案2】:

使用这个:

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

        return base.ShouldMap(member);
    }
}

这应该处理没有设置器和私有设置器的情况。

【讨论】:

  • 我开始使用方法。想接受它,但有点懒得在atm上测试它。 :)
  • 它适用于我和我的生产代码,但我不使用任何私人设置器。我不确定 NHibernate 是否可以处理带有私有设置器的属性。
【解决方案3】:

我知道这是个老问题,但下面的代码可以很好地使用私有设置器。

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

【讨论】:

    【解决方案4】:

    另一种方法是使用属性。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多