FluentNHibernate - 自动忽略属性

时间:2009-06-01 15:03:08

标签: fluent-nhibernate

我有一个包含名为IsDirty的属性的基类。这用于域模型,而不是数据库表中的列。

使用自动换行时,流畅的nhibernate尝试将此列添加到表中。解决此问题的方法是将.ForTypesThatDeriveFrom<Address>(p => p.IgnoreProperty(x => x.IsDirty))置于自动设置中。

问题是,我的所有实体都会这样做,有没有办法说明这一点而不必为每个实体添加这一行?如果我放.ForTypesThatDeriveFrom<Entity>(p => p.IgnoreProperty(x => x.IsDirty)),那么我在尝试将实体转换为地址时出错。

我也将实体设置为基本类型。

提前致谢, JT

3 个答案:

答案 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"))
                ))

来源:https://bernardorezende.wordpress.com/2011/12/12/ignore-property-mapping-with-fluent-nhibernates-automapping-model/