Маппинг на коллекции с подпиской на изменения (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() }));