Fluent nhibernate FluentNHibernate-自动映射忽略属性

Fluent nhibernate FluentNHibernate-自动映射忽略属性,fluent-nhibernate,Fluent Nhibernate,我有一个基类,它包含一个名为IsDirty的属性。这用于域模型,而不是数据库表中的列 使用自动映射时,fluent nhibernate会尝试将此列添加到表中。解决此问题的一种方法是将.fortypesthatterivefrom(p=>p.IgnoreProperty(x=>x.IsDirty))放入自动映射设置中 问题是,我的所有实体都会这样做,有没有一种方法可以在不必为每个实体添加这一行的情况下声明这一点?如果我将.ForTypesThatDeriveFrom(p=>p.IgnorePro

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

使用自动映射时,fluent nhibernate会尝试将此列添加到表中。解决此问题的一种方法是将
.fortypesthatterivefrom(p=>p.IgnoreProperty(x=>x.IsDirty))
放入自动映射设置中

问题是,我的所有实体都会这样做,有没有一种方法可以在不必为每个实体添加这一行的情况下声明这一点?如果我将
.ForTypesThatDeriveFrom(p=>p.IgnoreProperty(x=>x.IsDirty))
,那么我会在尝试将实体转换为地址时出错

我还将实体设置为基本类型

提前感谢,,
JT

我也遇到过同样的问题,只是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
    }
}
公共类IgnorePropertiesClassMapConvention:IClassConvention
{
公共布尔接受(IClassMap类映射)
{
返回true;
}
公共无效应用(IClassMap类映射)
{
var partsToIgnore=classMap.Parts.OfType()
.Where(IgnoreProperty).ToList();
foreach(零件中的var零件忽略)
((IList)classMap.Parts)。删除(part);
}
私有布尔IgnoreProperty(IProperty property)
{
//你的逻辑就在这里
}
}
我使用的代码有点不同,因为我需要删除的是多通映射:

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));
    }
}
公共类IgnorePartsBasedOnReturnTypeClassMapConvention:IClassConvention
{
公共布尔接受(IClassMap类映射)
{
返回true;
}
公共无效应用(IClassMap类映射)
{
var partsToIgnore=classMap.Parts.OfType()
.Where(IgnorePart.ToList();
foreach(零件中的var零件忽略)
((IList)classMap.Parts)。删除(part);
}
私人楼宇信号部分(IManyToOnePart部分)
{
返回IgnoreProperty(部分属性);
}
私有布尔IgnoreProperty(PropertyInfo PropertyInfo)
{
var ignoredNamespaces=new[]{“namespacestognore”};
return ignoredNamespaces.Any(namespc=>propertyInfo.GetGetMethod().ReturnType.Namespace.StartsWith(namespc));
}
}
我不确定这是否是最好的方法。
我的感觉是,应该覆盖可发现性部分,甚至不为不需要的属性构建该部分,但目前这似乎是可行的。

您创建一个派生自
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);
    }
}

OverrideAll
如果您不定义配置,似乎很适合

Fluently
    .Configure()
    .Mappings(x => x.AutoMappings.Add(AutoMap.AssemblyOf<MyEntity>(mapConfig)
            .OverrideAll(ign => ign.IgnoreProperty("MyPropertyToBeIgnored"))
                ))
流利
.Configure()
.Mappings(x=>x.AutoMappings.Add(AutoMap.AssemblyOf(mapConfig))
.OverrideAll(ign=>ign.IgnoreProperty(“MyPropertyToBeIgnored”))
))

来源:

我留下一条评论,而不是一个答案,因为虽然类似,但我不能100%肯定它在这个案例中会起作用。我今天早上在谷歌集团网站上问了一个类似的问题。这是詹姆斯·格雷戈里的回答。带设置(c=>c.IsBaseClass=type=>type==typeof(MyBaseEntity));如果您的x.Dirty属性位于该基类中,并且您排除了它,则应全面忽略它。这是链接,您可以回来更新StackOverflow GL上的答案!
Fluently
    .Configure()
    .Mappings(x => x.AutoMappings.Add(AutoMap.AssemblyOf<MyEntity>(mapConfig)
            .OverrideAll(ign => ign.IgnoreProperty("MyPropertyToBeIgnored"))
                ))