Fluent Nhibernate List <string> mapping </string>

时间:2014-09-24 13:10:34

标签: c# nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我有一个带有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);

2 个答案:

答案 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();
  }
}

映射表在数据库中看起来如下所示。

enter image description here

答案 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; }
}

这些是提示,您获得的例外或错误可以告诉我们更多