【问题标题】:Fluent-Nibernate with wpf: Convention to use uNhAddIns...ObservableListType<T> as default?Fluent-Nibernate with wpf:约定使用 uNhAddIns...ObservableListType<T> 作为默认值?
【发布时间】:2011-02-02 16:57:16
【问题描述】:

我正在尝试将 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");
            }
        }
    }

有人知道如何使用 Fluent-Nibernate 实现约定,始终使用 ObservableListType 作为默认 IList 实现

更新:完美的解决方案是用 Fluent-NHibernate-Automapper 替换

【问题讨论】:

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


    【解决方案1】:

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

    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>();
    

    【讨论】:

    • +1 这对我来说很好。我删除了我在这个答案上的 previos cmets,因为你相应地更新了你的答案。非常感谢。
    • 很高兴听到。很高兴我能帮上忙。
    猜你喜欢
    • 2013-12-09
    • 2018-11-25
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 2010-11-08
    • 2011-01-15
    相关资源
    最近更新 更多