成功使示例程序运行后,我现在开始使用 Fluent NHibernate 进行实际工作 - 尝试在我的项目的类层次结构上使用 Automapping。
这是一个科学仪器应用程序,我正在映射的类有几个属性是浮点数组,例如
private float[] _rawY;
public virtual float[] RawY
{
get
{
return _rawY;
}
set
{
_rawY = value;
}
}
这些数组最多可以包含 500 个值。
我没想到 Automapping 可以在数组上工作,但无论如何都尝试过,起初取得了一些成功。每个数组都自动映射到一个 BLOB(使用 SQLite),这似乎是一个可行的解决方案。
当我尝试对包含数组的对象调用 SaveOrUpdate 时,第一个问题出现了 - 我得到了“No persister for float[]”异常。
所以我的下一个想法是将我所有的数组转换为 ILists,例如
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();
}
so this must be possible using pure Automapping, but I've had zero luck getting anything to work, probably because I don't have the requisite knowlege of manually mapping with NHibernate.
Starting to think I'm going to have to hack this (by encoding the array of floats as a single string, or creating a class that contains a single float which I then aggregate into my lists), unless someone can tell me how to do it properly.
End Edit
Here's my CreateSessionFactory method, if that helps formulate a reply...
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;
}