流畅的NHibernate Automapping与抽象基类

时间:2011-05-09 11:13:40

标签: nhibernate configuration abstract-class fluent 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 =&gt; map.IgnoreProperty(“WhereAmI”))但我不希望它是全局的,因为在另一个类中我可能会使用相同的属性名称,我想要包含这个属性

除了使用界面之外,还有什么方法可以让它工作吗?

1 个答案:

答案 0 :(得分:4)

我尝试在FluentNHibernate代码中查找为什么IgnoreProperty似乎在被忽略的属性来自基类时崩溃,但是时间不够用了。如果get-only属性不是来自基类,它似乎工作正常。

无论如何,您的情况的解决方案似乎是通过继承DefaultAutomappingConfiguration来创建自定义IAutomappingConfiguration。请参阅此堆栈溢出答案:How can I create a Fluent NHibernate Convention that ignores properties that don't have setters

这是我成功用于自动化您提供的示例实体的自定义自动配置:

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子句必须移入自定义配置类,因为如果您使用自定义配置实例,则不允许将其链接。