流利的NHibernate Automapping抽象基类

鉴于以下类别:

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'的setter

我做的事情:

  • 当我从基类“地址”中删除属性时,它可以工作。
  • 当我使用.OverrideAll(map => map.IgnoreProperty(“WhereAmI”))但我不希望它是全球性的,因为在另一个类我可能会使用相同的属性名称,我想要包含此属性
  • 有没有什么办法可以让它继续工作,然后再使用接口?


    我试着在FluentNHibernate代码中追踪到为什么IgnoreProperty似乎在被忽略的属性来自基类时崩溃,但是耗尽了时间。 如果只能获取属性不是来自基类,它似乎工作正常。

    无论如何,解决方案似乎是通过从DefaultAutomappingConfiguration继承来创建自定义IAutomappingConfiguration。 看到这个堆栈溢出答案:我如何创建一个忽略没有setter的属性的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子句必须移动到自定义配置类中,因为它不允许被链接。

    链接地址: http://www.djcxy.com/p/52573.html

    上一篇: Fluent NHibernate Automapping with abstract base class

    下一篇: How to draw with an "inverted" paint in Android Canvas?