NHibernate 3.2 - 现在所有属性都需要“set”方法吗?

时间:2011-11-11 23:52:00

标签: nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我们最近将Automapped FNH / NH项目升级到NH 3.2,并遇到了很多问题。

我们的对象模型中有很多属性只有“getter”,例如

    public virtual float Polydispersity
    {
        get { return MeasurementRun.PolyDispersity; }
    }

这曾经工作正常,但现在我们得到“找不到属性的setter”错误。

这很难找到,因为由于某种原因,自动化无法创建数据库表,导致保存到数据库时出现“无持久性”错误 - 有关详细信息,请参阅this

这是因为LinFu现在已经建成了NH?我知道私人制定者不再有效,这似乎也是一个类似的问题。

我们曾经使用Castle,我真的很喜欢NH现在不需要所有其他DLL,但如果它破坏了我们对象模型的很大一部分,那就不行了。

有关如何解决这个问题的任何建议吗?

堆栈跟踪

  

FluentNHibernate.Cfg.FluentConfigurationException:无效或   创建SessionFactory时使用了不完整的配置。   检查PotentialReasons集合,以及InnerException以获取更多详细信息。

     

---> NHibernate.PropertyNotFoundException:找不到setter   适用于物业'Polydispersity'的课程   'BI_OverlordDlsAppCore.OfeDlsMeasurement'在   NHibernate.Properties.BasicPropertyAccessor.GetSetter(类型类型,   String propertyName)at NHibernate.Mapping.Property.GetSetter(Type   clazz)at   NHibernate.Tuple.Entity.PocoEntityTuplizer.BuildPropertySetter(物业   mappedProperty,PersistentClass mappedEntity)at   NHibernate.Tuple.Entity.AbstractEntityTuplizer..ctor(EntityMetamodel   entityMetamodel,PersistentClass mappingInfo)at   NHibernate.Tuple.Entity.PocoEntityTuplizer..ctor(EntityMetamodel   entityMetamodel,PersistentClass mappedEntity)at   NHibernate.Tuple.Entity.EntityEntityModeToTuplizerMapping..ctor(对PersistentClass   mappedEntity,EntityMetamodel em)at   NHibernate.Tuple.Entity.EntityMetamodel..ctor(对PersistentClass   persistentClass,ISessionFactoryImplementor sessionFactory)at   NHibernate.Persister.Entity.AbstractEntityPersister..ctor(对PersistentClass   persistentClass,ICacheConcurrencyStrategy cache,   ISessionFactoryImplementor工厂)在   NHibernate.Persister.Entity.JoinedSubclassEntityPersister..ctor(对PersistentClass   persistentClass,ICacheConcurrencyStrategy cache,   ISessionFactoryImplementor工厂,IMapping mapping)at   NHibernate.Persister.PersisterFactory.CreateClassPersister(对PersistentClass   model,ICacheConcurrencyStrategy cache,ISessionFactoryImplementor   工厂,IMapping cfg)at   NHibernate.Impl.SessionFactoryImpl..ctor(配置cfg,IMapping   映射,设置设置,EventListeners侦听器)   NHibernate.Cfg.Configuration.BuildSessionFactory()在   FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory()---   内部异常堆栈跟踪结束--- at   FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory()at   BI_OverlordPackageCore.OfeDatabase.CreateSqliteSessionFactory()in   C:\ Bicw_Dev \ Bic.Net \ Private Projects \ NHibernate \ FNH 1.3 Mapping   Bug \ OfeDatabase.cs:第192行   BI_OverlordPackageCore.OfeDatabase.GetMainSession()in   C:\ Bicw_Dev \ Bic.Net \ Private Projects \ NHibernate \ FNH 1.3 Mapping   Bug \ OfeDatabase.cs:第147行   BI_OverlordPackageCore.OfeDatabase.Initialize(Assembly []程序集)   在C:\ Bicw_Dev \ Bic.Net \ Private Projects \ NHibernate \ FNH 1.3 Mapping   Bug \ OfeDatabase.cs:第305行   FNH_1._3_Mapping_Bug.Form1.button1_Click(Object sender,EventArgs e)   在C:\ Bicw_Dev \ Bic.Net \ Private Projects \ NHibernate \ FNH 1.3 Mapping   Bug \ Form1.cs:第23行   System.Windows.Forms.Control.OnClick(EventArgs e)at   System.Windows.Forms.Button.OnClick(EventArgs e)at   System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)at at   System.Windows.Forms.Control.WmMouseUp(Message& m,MouseButtons   按钮,Int32点击)at   System.Windows.Forms.Control.WndProc(Message& m)at   System.Windows.Forms.ButtonBase.WndProc(Message& m)at   System.Windows.Forms.Button.WndProc(Message& m)at   System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)   在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&   m)在System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32)   msg,IntPtr wparam,IntPtr lparam)

1 个答案:

答案 0 :(得分:7)

您不应映射只读属性。

- 解决方案1 ​​

    var map = AutoMap.AssemblyOf<Dummy>()
         .OverrideAll(x => x.IgnoreProperties(property => !property.CanWrite));

- 解决方案2

internal class MyMappingConfiguration : DefaultAutomappingConfiguration
{
        public override bool ShouldMap(Member member)
        {
            return base.ShouldMap(member) && member.CanWrite;
        }
}

...然后使用你的conf:

var map = AutoMap.AssemblyOf<Dummy>(new MyMappingConfiguration());

编辑:添加了Tom Bushell的建议