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

相关问题