4

最近、Automapped FNH / NH プロジェクトを NH 3.2 にアップグレードしましたが、多くの問題が発生しています。

オブジェクト モデルには、「ゲッター」のみを持つ多くのプロパティがあります。

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

これは以前は正常に機能していましたが、「プロパティのセッターが見つかりませんでした」というエラーが発生するようになりました。

なんらかの理由で自動マッピングが DB テーブルの作成に黙って失敗し、DB に保存するときに「永続化なし」エラーが発生したため、これを見つけるのは困難でした。詳細については、こちらを参照してください。

これは、LinFu が NH に組み込まれたためですか? プライベートセッターが機能しなくなったことは知っていますが、これは同様の問題のようです。

以前は Castle を使用していましたが、現在 NH が他のすべての DLL を必要としない点が気に入っていますが、オブジェクト モデルの大部分が壊れる場合はそうではありません。

これを回避する方法について何か提案はありますか?

スタックトレース

FluentNHibernate.Cfg.FluentConfigurationException: SessionFactory の作成中に無効または不完全な構成が使用されました。詳細については、PotentialReasons コレクションと InnerException を確認してください。

---> NHibernate.PropertyNotFoundException: NHibernate.Properties.BasicPropertyAccessor.GetSetter(Type type, String propertyName) の NHibernate.Mapping.Property.GetSetter(Type clazz) で NHibernate.Tuple.Entity.PocoEntityTuplizer.BuildPropertySetter(Property mappedProperty, PersistentClass mappedEntity) で NHibernate.Tuple.Entity.AbstractEntityTuplizer..ctor(EntityMetamodel entityMetamodel, PersistentClass mappingInfo) で NHibernate.Tuple.Entity.PocoEntityTuplizer..ctor(EntityMetamodel) NHibernate.Tuple.Entity の NHibernate.Tuple.Entity.EntityEntityModeToTuplizerMapping..ctor(PersistentClass MappedEntity, EntityMetamodel em) の NHibernate.Tuple.Entity.NHibernate.Persister.Entity.AbstractEntityPersister..ctor(PersistentClass persistentClass、ICacheConcurrencyStrategy キャッシュ、ISessionFactoryImplementor ファクトリ) の EntityMetamodel..ctor(PersistentClasspersistentClass、ISessionFactoryImplementor sessionFactory) ISessionFactoryImplementor ファクトリ、IMapping マッピング) で NHibernate.Persister.PersisterFactory.CreateClassPersister(PersistentClass モデル、ICacheConcurrencyStrategy キャッシュ、ISessionFactoryImplementor ファクトリ、IMapping cfg) で NHibernate.Impl.SessionFactoryImpl..ctor(構成 cfg、IMapping マッピング、設定設定、EventListeners リスナー) でNHibernate.Cfg.Configuration.BuildSessionFactory() at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() --- 内部例外スタック トレースの終了 --- 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: C:\Bicw_Dev\Bic.Net\Private Projects\NHibernate\FNH 1.3 Mapping Bug\OfeDatabase.cs の BI_OverlordPackageCore.OfeDatabase.GetMainSession() の 192 行: C:\Bicw_Dev\Bic.Net\Private Projects\NHibernate\FNH 1.3 Mapping Bug\OfeDatabase.cs:line 305 at 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.OnMouseUp(MouseEventArgs) で System.Windows.Forms.Button.OnClick(EventArgs e) で System.Windows.Forms.Control.OnClick(EventArgs e) で Bug\Form1.cs:line 23 をマッピングします。 mevent) で System.Windows.Forms.Control.WmMouseUp(Message& m、MouseButtons ボタン、Int32 クリック) で System.Windows.Forms.Control.WndProc(Message& m) で System.Windows.Forms.ButtonBase.WndProc(Message& m) でSystem.Windows.Forms.Button.WndProc(Message& m) で System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) で System.Windows.Forms.Control.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 mevent) で System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons ボタン, Int32 クリック) System.Windows.Forms.Control.WndProc(Message& m) で System.Windows.Forms.ButtonBase.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 mevent) で System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons ボタン, Int32 クリック) System.Windows.Forms.Control.WndProc(Message& m) で System.Windows.Forms.ButtonBase.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)System.Windows.Forms.ButtonBase.WndProc(Message& m) で System.Windows.Forms.Button.WndProc( System.Windows.Forms.Control.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)System.Windows.Forms.ButtonBase.WndProc(Message& m) で System.Windows.Forms.Button.WndProc( System.Windows.Forms.Control.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)System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd、Int32 msg、IntPtr wparam、IntPtr lparam) の Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd、Int32 msg、IntPtr wparam、IntPtr lparam) の Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)

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 に答える