我有一个包含名为IsDirty的属性的基类。这用于域模型,而不是数据库表中的列。
使用自动换行时,流畅的nhibernate尝试将此列添加到表中。解决此问题的方法是将.ForTypesThatDeriveFrom<Address>(p => p.IgnoreProperty(x => x.IsDirty))
置于自动设置中。
问题是,我的所有实体都会这样做,有没有办法说明这一点而不必为每个实体添加这一行?如果我放.ForTypesThatDeriveFrom<Entity>(p => p.IgnoreProperty(x => x.IsDirty))
,那么我在尝试将实体转换为地址时出错。
我也将实体设置为基本类型。
提前致谢, JT
答案 0 :(得分:8)
您创建一个派生自DefaultAutomappingConfiguration
的类,并覆盖ShouldMap(Member member)
方法。
像这样:
public class AutoMapConfiguration : DefaultAutomappingConfiguration
{
private static readonly IList<string> IgnoredMembers = new List<string> {"IsNew", "IsDeleted"};
public override bool ShouldMap(Member member)
{
return base.ShouldMap(member) && !IgnoredMembers.Contains(member.Name);
}
}
然后您的流畅配置将如下所示:
Fluently.Configure()
// Database settings
.Mappings(m => {
m.AutoMappings.Add(yourMappingAssembly, new AutoMapConfiguration())
});
答案 1 :(得分:1)
我遇到了同样的问题,除了NHibernate抱怨缺少课程。
我相信你可以使用以下约定来删除从类中映射属性的部分:
public class IgnorePropertiesClassMapConvention : IClassConvention
{
public bool Accept(IClassMap classMaps)
{
return true;
}
public void Apply(IClassMap classMap)
{
var partsToIgnore = classMap.Parts.OfType<IProperty>()
.Where(IgnoreProperty).ToList();
foreach (var part in partsToIgnore)
((IList<IMappingPart>)classMap.Parts).Remove(part);
}
private bool IgnoreProperty(IProperty property)
{
// Your logic would be here
}
}
我使用的代码有点不同,因为我需要删除的是ManyToOne映射:
public class IgnorePartsBasedOnReturnTypeClassMapConvention : IClassConvention
{
public bool Accept(IClassMap classMaps)
{
return true;
}
public void Apply(IClassMap classMap)
{
var partsToIgnore = classMap.Parts.OfType<IManyToOnePart>()
.Where(IgnorePart).ToList();
foreach (var part in partsToIgnore)
((IList<IMappingPart>)classMap.Parts).Remove(part);
}
private bool IgnorePart(IManyToOnePart part)
{
return IgnoreProperty(part.Property);
}
private bool IgnoreProperty(PropertyInfo propertyInfo)
{
var ignoredNamespaces = new []{"namespacesToIgnore"};
return ignoredNamespaces.Any(namespc => propertyInfo.GetGetMethod().ReturnType.Namespace.StartsWith(namespc));
}
}
我不确定这是否是最好的方法。 我的感觉是,可发现部分应该被覆盖,甚至不能为不需要的属性构建部件,但是现在这似乎有效。
答案 2 :(得分:0)
OverrideAll
似乎很合适。
Fluently
.Configure()
.Mappings(x => x.AutoMappings.Add(AutoMap.AssemblyOf<MyEntity>(mapConfig)
.OverrideAll(ign => ign.IgnoreProperty("MyPropertyToBeIgnored"))
))