У меня написано несколько существующих моделей, и я пытался сопоставить их с NHibernate (версия 5). Как оказалось, это свойства, представленные как IEnumerable<T>
с полями поддержки, объявленными как ICollection<T>
, например:
public class Encounter
{
public virtual String Title { get; protected set; } = null!;
public virtual IEnumerable<Conversation> Conversations => _conversations.AsEnumerable();
private ICollection<Conversation> _conversations = new HashSet<Conversation>();
protected Encounter() { }
// ...
}
Я пытаюсь использовать ConventionModelMapper
как можно больше, и покатак хорошо, но я обнаружил, что он не знает, что делать с ICollection<T>
, и я получаю TransientObjectException
s, когда он пытается сохранить объекты в этих коллекциях. Если я поменяю их на ISet<T>
s, то по правилам все будет нормально ... но похоже, что это должно быть то, что я должен быть в состоянии легко сказать ConventionModelMapper
, так как у меня есть несколько таких ICollection<T>
участники.
Я не нахожу легкий путь ... Это часть пути, но он переопределяет существующую логику IsSet()
, поэтому мне пришлось бы добавить обратно условия для ISet
членов впо крайней мере, и это не работает для моих IEnumerable<T>
свойств с полями поддержки (с которыми NH явно способен иметь дело, потому что он правильно подбирает ISet
поля поддержки) ...
var mapper = new ConventionModelMapper();
mapper.IsSet((memberInfo, b1) =>
{
var memberType = memberInfo.GetPropertyOrFieldType();
if (memberType.IsGenericType)
{
return memberType.GetGenericInterfaceTypeDefinitions().Contains(typeof(ICollection<>));
}
return false;
});
Кажетсякак это должно быть проще, я пропускаю ловушку событий?