4

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

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

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

这过去可以正常工作,但现在我们得到“找不到属性的设置器”错误。

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

这是因为LinFu 现在内置在NH 中了吗?我知道私人二传手不再工作,这似乎是一个类似的问题。

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

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

堆栈跟踪

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

---> NHibernate.PropertyNotFoundException: 在 NHibernate.Properties.BasicPropertyAccessor.GetSetter(Type type, String propertyName) at NHibernate.Mapping.Property.GetSetter(Type clazz) 在 NHibernate.Tuple.Entity.AbstractEntityTuplizer..ctor(EntityMetamodel entityMetamodel, PersistentClass mappingInfo) 在 NHibernate.Tuple.Entity.PocoEntityTuplizer..ctor(EntityMetamodel) 的 NHibernate.Tuple.Entity.PocoEntityTuplizer.BuildPropertySetter(Property mappedProperty, PersistentClass mappedEntity) NHibernate.Tuple.Entity.EntityEntityModeToTuplizerMapping..ctor(PersistentClass mappedEntity, EntityMetamodel em) 在 NHibernate.Tuple.Entity 的 entityMetamodel, PersistentClass mappedEntity)。NHibernate.Persister.Entity.AbstractEntityPersister 的 EntityMetamodel..ctor(PersistentClass persistentClass, ISessionFactoryImplementor sessionFactory) 在 NHibernate.Persister.Entity.JoinedSubclassEntityPersister..ctor(PersistentClass persistentClass, ICacheConcurrencyStrategy 缓存, ISessionFactoryImplementor factory, IMapping mapping) at NHibernate.Persister.PersisterFactory.CreateClassPersister(PersistentClass model, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping cfg) at NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners) at NHibernate.Cfg.配置。FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() 处的 BuildSessionFactory() --- 内部异常堆栈跟踪结束 --- 位于 C:\Bicw_Dev\Bic 中 BI_OverlordPackageCore.OfeDatabase.CreateSqliteSessionFactory() 的 FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() .Net\Private Projects\NHibernate\FNH 1.3 映射错误\OfeDatabase.cs:C:\Bicw_Dev\Bic.Net\Private Projects\NHibernate\FNH 1.3 映射错误\OfeDatabase.cs 中 BI_OverlordPackageCore.OfeDatabase.GetMainSession() 的第 192 行:C:\Bicw_Dev\Bic.Net\Private Projects\NHibernate\FNH 1.3 映射错误\OfeDatabase.cs 中 BI_OverlordPackageCore.OfeDatabase.Initialize(Assembly[] 程序集)的第 147 行:FNH_1._3_Mapping_Bug.Form1.button1_Click( C:\Bicw_Dev\Bic.Net\Private Projects\NHibernate\FNH 1 中的对象发送方,EventArgs e)。3 在 System.Windows.Forms.Button.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs) 的 System.Windows.Forms.Control.OnClick(EventArgs e) 映射 Bug\Form1.cs:line 23 mevent) 在 System.Windows.Forms.Control.WndProc(Message& m) 在 System.Windows.Forms.ButtonBase.WndProc(Message& m) 在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)在 System.Windows.Forms.Button.WndProc(Message& m) 在 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)OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs 事件) 在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 点击)在 System.Windows.Forms.ButtonBase.WndProc(Message& m) 的 System.Windows.Forms.Control.WndProc(Message& m) 在 System.Windows.Forms.Button.WndProc(Message& m) 在 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)OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs 事件) 在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 点击)在 System.Windows.Forms.ButtonBase.WndProc(Message& m) 的 System.Windows.Forms.Control.WndProc(Message& m) 在 System.Windows.Forms.Button.WndProc(Message& m) 在 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)WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ButtonBase.WndProc(Message& m) at System.Windows.Forms.Button.WndProc( Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32味精,IntPtr wparam,IntPtr lparam)WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ButtonBase.WndProc(Message& m) at System.Windows.Forms.Button.WndProc( Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32味精,IntPtr wparam,IntPtr lparam)Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

4

1 回答 1

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 的建议

于 2011-11-14T16:03:58.553 回答