4

我們最近將自動映射的FNH/NH項目升級到了NH 3.2,並且遇到了很多問題。NHibernate 3.2 - 現在所有的屬性都需要一個「set」方法嗎?

我們的對象模型中只有一個「getter」的屬性有很多,例如,

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

這用於正常工作,但現在我們得到「無法找到屬性的setter」錯誤。

這很難找到,因爲由於某些原因,自動映射默默無法創建數據庫表,從而在保存到數據庫時導致「無殘留」錯誤 - 有關詳細信息,請參閱this

這是因爲LinFu現在已經建成NH嗎?我知道私人定製者不再工作,這似乎是一個類似的問題。

我們以前使用城堡,我真的很喜歡NH不需要所有其他DLL現在,但如果它打破我們的對象模型的重要組成部分。

有關如何解決此問題的任何建議?

堆棧跟蹤

FluentNHibernate.Cfg.FluentConfigurationException:創建一個會話無效或 不完整的配置中使用。 檢查PotentialReasons集合和InnerException以獲取更多詳細信息。

---> NHibernate.PropertyNotFoundException:類找不到一個二傳手 財產 '多分散' 在NHibernate的 'BI_OverlordDlsAppCore.OfeDlsMeasurement' 在 NHibernate.Properties.BasicPropertyAccessor.GetSetter(類型類型, 字符串propertyName的) .Mapping.Property.GetSetter(類型 clazz所)在 NHibernate.Tuple.Entity.PocoEntityTuplizer.BuildPropertySetter(物業 mappedProperty,對PersistentClass mappedEntity)在 NHibernate.Tuple.Entity.AbstractEntityTuplizer..ctor(entityMetamodel entityMetamodel,對PersistentClass mappingInfo)在 NHibernate.Tuple.Entity.Po coEntityTuplizer..ctor(EntityMetamodel entityMetamodel,對PersistentClass mappedEntity)在 NHibernate.Tuple.Entity.EntityEntityModeToTuplizerMapping..ctor(對PersistentClass mappedEntity,EntityMetamodel EM)在 NHibernate.Tuple.Entity.EntityMetamodel..ctor(對PersistentClass 對PersistentClass,ISessionFactoryImplementor SessionFactory的)在 NHibernate.Persister.Entity.AbstractEntityPersister..ctor(對PersistentClass 對PersistentClass,ICacheConcurrencyStrategy緩存, ISessionFactoryImplementor廠)在 NHibernate.Persister.Entity.JoinedSubclassEntityPersister..ctor(對PersistentClass 對PersistentClass,ICacheConcurrencyStrategy緩存, ISessionFactoryImplement或工廠,在 NHibernate.Persister.PersisterFactory.CreateClassPersister(對PersistentClass 模型,ICacheConcurrencyStrategy緩存,ISessionFactoryImplementor 工廠,IMapping CFG)在 NHibernate.Impl.SessionFactoryImpl..ctor(配置CFG,IMapping 映射IMapping映射),設置設置,EventListeners監聽器)在 NHibernate.Cfg.Configuration。BuildSessionFactory()在 FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory()--- 內部異常堆棧跟蹤的末尾在 FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory()在 BI_OverlordPackageCore.OfeDatabase.CreateSqliteSessionFactory()在 Ç Bicw_Dev \ Bic.Net \ Private Projects \ NHibernate \ FNH 1.3映射 Bug \ FNH 1.3映射 Bug \ OfeDatabase.cs:第147行 BI_OverlordPackageCore.OfeDatabase.Initialize(Assembly []程序集) in C:\ Bicw_Dev \ Bic.Net \ Private Projects \ NHibernate \ FNH 1.3映射 錯誤\ OfeDatabase.cs:線305在 FNH_1._3_Mapping_Bug.Form1.button1_Click(對象發件人,EventArgs的) 在C:\ Bicw_Dev \ Bic.Net \私營項目\ NHibernate的\ FNH 1.3映射 錯誤\ Form1.cs中:在 System.Windows.Forms.Control.OnClick(EventArgs e)上 System.Windows.Forms.Button.OnClick(EventArgs e)上 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)在 第23行System.Windows.Forms.Control.WmMouseUp(消息&米,MouseButtons 按鈕,點擊的Int32)在 System.Windows.Forms.Control.WndProc(消息& m)上 System.Windows.Forms.ButtonBase.WndProc(消息& m)在 System.Windows.Forms.Button.WndProc(消息& m)上 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息&米) 在System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息& M)在System.Windows.Forms.NativeWindow.Callback(IntPtr的的HWND,的Int32 味精,IntPtr的WPARAM,LPARAM的IntPtr)

+1

我使用NHibernate 3.2.0.GA許多隻能得到屬性,它工作正常。請發佈完整的異常消息和堆棧跟蹤。 – cremor

+0

@cremor - 我添加了棧跟蹤 –

回答

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

艾迪t:添加了湯姆布謝爾的建議

+1

謝謝 - 我可能能夠使用這個作爲解決方法,但我發現它更方便做爲我的AutoMap調用覆蓋,即.OverrideAll(map => map.IgnoreProperties( prop =>!prop.CanWrite)。這消除了我的示例項目中的異常,但映射仍然在我的真實項目中無聲無息地出現。 –

+0

解決方案1的工作非常棒! – Joel

相關問題