サンプル プログラムが正常に動作するようになったので、Fluent NHibernate を使用して実際の作業を開始します。プロジェクトのクラス階層で Automapping を使用しようとしています。
これは科学計測アプリケーションであり、マッピングしているクラスには、float の配列であるいくつかのプロパティがあります。
private float[] _rawY;
public virtual float[] RawY
{
get
{
return _rawY;
}
set
{
_rawY = value;
}
}
これらの配列には、最大 500 個の値を含めることができます。
自動マッピングが配列で機能するとは思っていませんでしたが、とにかく試してみて、最初はある程度成功しました。各配列は (SQLite を使用して) BLOB に自動マップされ、実行可能なソリューションのように見えました。
最初の問題は、配列を含むオブジェクトで SaveOrUpdate を呼び出そうとしたときに発生しました。「float [] の永続化がありません」という例外が発生しました。
だから私の次の考えは、すべての配列を IList に変換することでした。
public virtual IList<float> RawY { get; set; }
しかし、今私は得る:
NHibernate.MappingException: Association references unmapped class: System.Single
Automapping は複雑なオブジェクトのリストを処理できるため、基本型のリストをマップできないとは思いもしませんでした。しかし、解決策のためにいくつかのグーグルを行った後、これは事実のようです。一部の人々は問題を解決したようですが、私が見たサンプル コードは、私が今持っているよりも多くの NHibernate の知識を必要とします - 私はそれを理解していませんでした。
質問:
1. Automapping でこれを機能させるにはどうすればよいですか?
2. また、このアプリケーションでは配列とリストのどちらを使用するのが良いですか?
必要に応じて、どちらかを使用するようにアプリを変更できます (リストの方が好きですが)。
編集:
Mapping Collection of Stringsのコードを調べたところ、ソースに文字列の IList を設定するテスト コードがあることがわかりました。
public virtual IList<string> ListOfSimpleChildren { get; set; }
[Test]
public void CanSetAsElement()
{
new MappingTester<OneToManyTarget>()
.ForMapping(m => m.HasMany(x => x.ListOfSimpleChildren).Element("columnName"))
.Element("class/bag/element").Exists();
}
したがって、これは純粋な Automapping を使用して可能であるに違いありませんが、おそらく NHibernate で手動でマッピングするための必要な知識がないため、何も機能させることができませんでした。
誰かが私に方法を教えてくれない限り、これをハックする必要があると考え始めています (float の配列を単一の文字列としてエンコードするか、単一の float を含むクラスを作成し、それをリストに集約します)。それを適切に。
編集を終了
これが私の CreateSessionFactory メソッドです。それが返信の作成に役立つ場合...
private static ISessionFactory CreateSessionFactory()
{
ISessionFactory sessionFactory = null;
const string autoMapExportDir = "AutoMapExport";
if( !Directory.Exists(autoMapExportDir) )
Directory.CreateDirectory(autoMapExportDir);
try
{
var autoPersistenceModel =
AutoMap.AssemblyOf<DlsAppOverlordExportRunData>()
.Where(t => t.Namespace == "DlsAppAutomapped")
.Conventions.Add( DefaultCascade.All() )
;
sessionFactory = Fluently.Configure()
.Database(SQLiteConfiguration.Standard
.UsingFile(DbFile)
.ShowSql()
)
.Mappings(m => m.AutoMappings.Add(autoPersistenceModel)
.ExportTo(autoMapExportDir)
)
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory()
;
}
catch (Exception e)
{
Debug.WriteLine(e);
}
return sessionFactory;
}