我有一个带有IList<string>
属性的简单类。如何在Fluent Nhibernate中映射此房源?
[Serializable]
public class ExportTask
{
private IList<string> _csvExportList = new List<string>();
public ExportTask()
{}
public virtual IList<string> CsvExportList
{
get { return _csvExportList; }
set { _csvExportList = value; }
}
}
public class ExportTaskMap : SubclassMap<ExportTask>
{
public ExportTaskMap()
{
HasMany(x => x.CsvExportList)
.Element("CsvExportList")
.Cascade
.AllDeleteOrphan();
}
}
发生以下错误:
Initializing -failed to lazily initialize a collection of role: MyApp.Tasks.ExportTask.CsvExportList, no session or session was closed
在集合上调用addrange时:
var exportList = new List<string>()
{
{"item1"},
{"item2"}
};
CsvExportList.AddRange(exportList);
答案 0 :(得分:6)
事实证明,我们可以使用AsList
映射列表索引和allworks。我想知道为什么这个简单的用例没有答案。希望它有助于某人。
public class ExportTaskMap : SubclassMap<ExportTask>
{
public ExportTaskMap()
{
HasMany(x => x.CsvExportList)
.Element(@"CsvProperty")
.KeyColumn(@"ExportTask_id")
.Table(@"CsvExportProperties")
.AsList(x => x.Column(@"CsvPropertyListIndex"))
.Not.LazyLoad();
}
}
映射表在数据库中看起来如下所示。
答案 1 :(得分:0)
看到你得到的错误会很有帮助,但有一点似乎很明显:你IList<string> CsvExportList
缺少setter 。因此,映射应该以字段为目标
HasMany<string>(Reveal.Property<string>("_csvExportList"))
检查这些如何处理字段映射:
或者将您的IList<string>
更改为至少拥有受保护的setter (我个人会这样做)并删除只读设置。
private IList<string> _csvExportList;
public virtual IList<string> CsvExportList
{
get { return _csvExportList ?? (_csvExportList = new List<string>(); }
protected set { _csvExportList = value; }
}
这些是提示,您获得的例外或错误可以告诉我们更多