鉴于以下课程:
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
我做的事情:
除了使用界面之外,还有什么方法可以让它工作吗?
答案 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子句必须移入自定义配置类,因为如果您使用自定义配置实例,则不允许将其链接。