【问题标题】:Fluent NHibernate + AutoMap + Observable流畅的 NHibernate + AutoMap + Observable
【发布时间】:2011-02-21 04:45:00
【问题描述】:

我是 Fluent NHibernate 的新手,但被 Automapping 和平台的其他强大功能集所吸引。我在设置 ObservableCollection 时遇到了问题,我在网上搜索并尝试了许多不同的方法,但所有这些都让我回到了同样的错误:

FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.

 ---> FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.

 ---> System.ArgumentException: Cannot create an instance of FluentNHibernate.Automapping.AutoMapping`1[uNhAddIns.WPF.Collections.Types.ObservableListType`1[T]] because Type.ContainsGenericParameters is true.
   at System.RuntimeType.CreateInstanceCheckThis()
   at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at FluentNHibernate.Automapping.AutoMapper.ApplyOverrides(Type classType, IList`1 mappedMembers, ClassMappingBase mapping) in d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Automapping\AutoMapper.cs:line 28
   at FluentNHibernate.Automapping.AutoMapper.MergeMap(Type classType, ClassMappingBase mapping, IList`1 mappedMembers) in d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Automapping\AutoMapper.cs:line 41
   at FluentNHibernate.Automapping.AutoMapper.Map(Type classType, List`1 types) in d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Automapping\AutoMapper.cs:line 176
   at FluentNHibernate.Automapping.AutoPersistenceModel.AddMapping(Type type) in d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Automapping\AutoPersistenceModel.cs:line 185
   at FluentNHibernate.Automapping.AutoPersistenceModel.CompileMappings() in d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Automapping\AutoPersistenceModel.cs:line 149
   at FluentNHibernate.Automapping.AutoPersistenceModel.Configure(Configuration configuration) in d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Automapping\AutoPersistenceModel.cs:line 175
   at FluentNHibernate.Cfg.AutoMappingsContainer.Apply(Configuration cfg) in d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Cfg\AutoMappingsContainer.cs:line 84
   at FluentNHibernate.Cfg.MappingConfiguration.Apply(Configuration cfg) in d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Cfg\MappingConfiguration.cs:line 66
   at FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration() in d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 128
   --- End of inner exception stack trace ---
   at FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration() in d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 139
   at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 108
   --- End of inner exception stack trace ---
   at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 113
   at ToDoIt2.Model.Document.<Initialize>b__0() in C:\data\svn\WPF\vs2010\ToDoIt2\Application\Model\Document.cs:line 54
   at ToDoIt2.App.DisplayException(NoArgsDelegate z) in C:\data\svn\WPF\vs2010\ToDoIt2\Application\App.xaml.cs:line 66

这是适用的行:

---> System.ArgumentException: Cannot create an instance of 
FluentNHibernate.Automapping.AutoMapping`1[uNhAddIns.WPF.Collections.Types.ObservableListType`1[T]]
because Type.ContainsGenericParameters is true.

这是我要映射的类:

public class Item {
    public virtual int ItemID { get; set; }
    public virtual string Title { get; set; }
    public virtual ObservableListType<string> Children { get; set; }
}

使用来自 uNhAddIns 的 uNhAddIns.WPF.Collections.Types.ObservableListType。

这是我的自动映射:

this.FluentConfig = Fluently.Configure()
                    .Mappings(m => m.AutoMappings
                        .Add(AutoMap
                            .Assemblies(new ToDoIt2.DB.AutoMapping(), 
                                Assembly.GetExecutingAssembly(),
                                Assembly.GetAssembly(typeof(ObservableListType<>))
                            )
                            .IgnoreBase<pklib.DataObject>()
                            .Conventions.Add<myPrimaryKeyConvention>()
                            .Conventions.Add<myForeignKeyConvention>()
                        ));  

@Diego 的回答

域实体需要更改为:

public class Item {
    public virtual int ItemID { get; set; }
    public virtual string Title { get; set; }
    public virtual ICollection<string> Children { get; set; }
}

Fluent 配置更改为:

this.FluentConfig = Fluently.Configure()
        .ExposeConfiguration(cfg => cfg.SetProperty(NHibernate.Cfg.Environment.CollectionTypeFactoryClass,
             typeof(WpfCollectionTypeFactory).AssemblyQualifiedName))
        .Mappings(m => m.AutoMappings
            .Add(AutoMap
                .Assemblies(new ToDoIt2.DB.AutoMapping(), 
                    Assembly.GetExecutingAssembly(),
                    Assembly.GetAssembly(typeof(ObservableListType<>))
                )
                .IgnoreBase<pklib.DataObject>()
                .Conventions.Add<myPrimaryKeyConvention>()
                .Conventions.Add<myForeignKeyConvention>()
            ));

【问题讨论】:

    标签: nhibernate fluent-nhibernate fluent automapping observable


    【解决方案1】:

    您不应该在您的类和映射中直接使用 ObservableListType(使用 ICollection&lt;T&gt;IList&lt;T&gt; 等)

    相反,您需要使用WpfCollectionTypeFactory 作为集合类型工厂。

    在 XML 配置中,这是通过设置 collectiontype.factory_class="uNhAddIns.WPF.Collections.WpfCollectionTypeFactory, uNhAddIns.WPF" 来完成的。

    我不知道Fluent有没有快捷键,但是你可以使用以下:

    .ExposeConfiguration(cfg => SetProperty(Environment.CollectionTypeFactoryClass,
                             typeof(WpfCollectionTypeFactory).AssemblyQualifiedName))
    

    【讨论】:

    • 成功了,谢谢。我编辑了我的原始问题以包含一个完全上下文的答案。谢谢@迭戈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多