Маппинг на коллекции с подпиской на изменения (INotifyCollectionChanged) - QualitySolution/QSProjects GitHub Wiki
Описание
Если нужны коллекции с подпиской на изменения используйте IObservableList из проекта QS.Extensions.Observable. Данные классы реализуют интерфейсы INotifyCollectionChanged для отслеживания изменений самой коллекции и INotifyCollectionElementChanged для отслеживания изменений в элементах коллекций.
yTreeView может использовать IObservableList с помощью провайдера TreeModelProvider, что позволяет ему обновлять отображение при изменении коллекции. Если есть необходимость использовать другой лист, то можно заменить провайдер модели с помощью свойства в TreeView: TreeView.TreeModelProvider.
Интерфейс IObservableList реализуют два класса:
- ObservableList - По сути обычный лист, который можно использовать где угодно и получать уведомления об изменениях
- PersistentGenericObservableBag - Класс коллекции которую может создавать NHibernate загружая вложенные в доменные объекты листы.
Использование с NHibernate
В доменном объекте
Пример:
private IObservableList<NomenclatureImage> images = new ObservableList<NomenclatureImage>();
public virtual IObservableList<NomenclatureImage> Images
{
get => images;
set => SetField(ref images, value);
}
Маппинг в каждом объекте
Для свойства коллекции IObservableList в маппинге необходимо установить тип коллекции.
HasMany(x => x.Images).KeyColumn("nomenclature_id")
.Inverse()
.Cascade.AllDeleteOrphan()
.LazyLoad()
.CollectionType<ObservableList<NomenclatureImage>>();
Маппинг на все интерфейсы по конвенции
В сущности в свойстве коллекции используем IObservableList в маппинге при этом ничего специального добавлять не нужно. Любые сущности в проекте со свойствами IObservableList будут маппиться автоматически.
HasMany(x => x.Images).KeyColumn("nomenclature_id")
.Inverse()
.Cascade.AllDeleteOrphan()
.LazyLoad();
Но в конфигурации базы необходимо добавить конвенцию:
в специальное свойство:
OrmConfig.Conventions = new[] { new ObservableListConvention() };
или вручную в конфигураторе:
Fluently.Configure().Mappings(m => m.FluentMappings.Conventions.Add(new[] { new ObservableListConvention() }));