У меня была такая же проблема, за исключением того, что 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));
}
}
Я не совсем уверен, что это лучший способ сделать это.
Я чувствую, что часть обнаруживаемости должна быть перекрыта способностью даже не создавать часть для нежелательных свойств, но сейчас это, кажется, работает.