我刚接触到流利的NHibernate,但被自动控制和其他伟大的平台功能重置所吸引。我在获得ObservableCollection设置方面遇到了困难,我已经浏览了web并尝试了许多不同的东西,它们都使我回到了相同的错误:
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.WPF.Collections.Types.ObservableListType的uNhAddIns。
这是我的AutoMapping:
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>()
));发布于 2011-02-21 12:10:28
不应该在类和映射中直接使用ObservableListType (使用ICollection<T>、IList<T>等)
相反,您需要使用WpfCollectionTypeFactory作为集合类型工厂。
在XML配置中,这是通过设置collectiontype.factory_class="uNhAddIns.WPF.Collections.WpfCollectionTypeFactory, uNhAddIns.WPF"来完成的。
我不知道Fluent是否有任何快捷方式,但您可以使用以下方法:
.ExposeConfiguration(cfg => SetProperty(Environment.CollectionTypeFactoryClass,
typeof(WpfCollectionTypeFactory).AssemblyQualifiedName))https://stackoverflow.com/questions/5062391
复制相似问题