Fluent NHibernate与抽象基类的自动映射

Fluent NHibernate与抽象基类的自动映射,nhibernate,configuration,abstract-class,fluent,automapping,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 a

鉴于以下类别:

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"));
var autoMap=autoMap.AssemblyOf()
.Override(map=>map.IgnoreProperty(p=>p.mi))
.Override(map=>map.IgnoreProperty(p=>p.mi))
.Where(type=>type.Namespace!=null&&type.Namespace.Contains(“模型”);
我仍然收到错误:在类“Address”中找不到属性“wheremi”的setter

我所做的事情:

  • 当我从基类“Address”中删除属性时,它会工作
  • 当我使用.OverrideAll(map=>map.IgnoreProperty(“wheremi”))时,但我不希望它是全局的,因为在另一个类中,我可能会使用我确实希望包含此属性的相同属性名

除了使用接口,还有什么方法可以让它工作吗?

我试着在FluentNHibernate代码中找到当被忽略的属性来自基类但时间不够时IgnoreProperty似乎崩溃的确切原因。如果get-only属性不是来自基类,那么它似乎可以正常工作

无论如何,解决这种情况的方法似乎是通过继承DefaultAutomappingConfiguration来创建自定义IAutomappingConfiguration。请参阅此堆栈溢出答案:

以下是我成功用于自动映射您提供的示例实体的自定义自动映射配置:

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());
var autoMap=autoMap
.AssemblyOf(新的CustomConfiguration());

请注意,您的示例中的Where子句必须移动到自定义配置类中,因为如果您使用的是自定义配置实例,则不允许对其进行链接

哇,没想到还会有答案。我无法检查答案,因为我不再为遇到此问题的公司工作。(甚至连代码都没有了)。还是对回答这个问题竖起大拇指。也许这对其他人会有帮助。如果这个答案有效,我什么也没听到,但从阅读中我发现;我说它会起作用的。谢谢你的建议。5年后的经验告诉你:你的修复效果非常好。