Fluent-Nibernate与wpf:约定使用uNhAddIns ... ObservableListType <t>是默认值?</t>

时间:2011-02-02 16:57:16

标签: wpf collections fluent-nhibernate nhibernate-mapping nhibernate-collections

我正在尝试将Fluent-Nibernate与需要Observable集合的wpf一起使用(实现INotifyCollectionChanged接口)。

uNHAddins: Unofficial addins for NHibernate我找到了

    uNhAddIns.WPF.Collections.Types.ObservableListType<T>

实现INotifyCollectionChanged。它可以像这样配置在Fluent-Nibernate中

    namespace FluentNHibernateTutorial.Mappings
    {
        public class StoreMap : ClassMap<Store>
        {
            public StoreMap()
            {
                Id(x => x.Id);
                Map(x => x.Name);
                HasManyToMany(x => x.Products)
                 .CollectionType<uNhAddIns.WPF.Collections.Types
                                      .ObservableListType<Product>>()
                 .Cascade.All()
                 .Table("StoreProduct");
            }
        }
    }

是否有人知道如何使用 ObservableListType作为默认的IList实现来使用Fluent-Nibernate 实现约定

更新:完美的解决方案可以替代Fluent-NHibernate-Automapper

1 个答案:

答案 0 :(得分:7)

这样的事情可以解决问题:

public class ObservableListConvention :
    IHasManyConvention, IHasManyToManyConvention, ICollectionConvention {

    // For one-to-many relations
    public void Apply(IOneToManyCollectionInstance instance) {

        ApplyObservableListConvention(instance);
    }

    // For many-to-many relations
    public void Apply(IManyToManyCollectionInstance instance) {

        ApplyObservableListConvention(instance);
    }

    // For collections of components or simple types
    public void Apply(ICollectionInstance instance) {

        ApplyObservableListConvention(instance);
    }

    private void ApplyObservableListConvention(ICollectionInstance instance) {

        Type collectionType =
            typeof(uNhAddIns.WPF.Collections.Types.ObservableListType<>)
            .MakeGenericType(instance.ChildType);
        instance.CollectionType(collectionType);
    }
}

回答问题更新:

此约定适用于自动播放器,如下所示:

AutoMap.AssemblyOf<Store>(cfg)
  .Conventions.Add<ObservableListConvention>();