【问题标题】:Fluent Nhibernate List<string> mappingFluent Nhibernate List<string> 映射
【发布时间】:2014-09-24 13:10:34
【问题描述】:

我有一个带有IList&lt;string&gt; 属性的简单类。如何在 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);

【问题讨论】:

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


    【解决方案1】:

    事实证明,我们可以将AsList 映射与列表索引的列一起使用,并且效果很好。我想知道为什么这个简单的用例没有答案。希望它对某人有所帮助。

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

    并且映射表在数据库中将如下所示。

    【讨论】:

    • 这不适用于 IList,但仅适用于 IList,知道为什么吗?索引列始终为空。
    • 您不能使用这种映射方式来映射对象列表。还有其他方法可以做到这一点。
    【解决方案2】:

    查看您遇到的错误会有所帮助,但有一件事似乎很明显:您缺少IList&lt;string&gt; CsvExportList 的设置器。所以,映射应该针对字段

    HasMany<string>(Reveal.Property<string>("_csvExportList"))
    

    检查这些如何处理字段映射:

    或者将您的IList&lt;string&gt; 更改为至少具有受保护的设置器(我个人会这样做)并删除只读设置。

    private IList<string> _csvExportList;
    public virtual IList<string> CsvExportList
    {
        get { return _csvExportList ?? (_csvExportList = new List<string>(); }
        protected set { _csvExportList = value; }
    }
    

    这些是提示,您遇到的异常或错误可以告诉我们更多信息

    【讨论】:

    • 添加了额外的错误信息。 HasMany(Reveal.Property("_csvExportList")) 无法使用,因为语法导致错误。此外,由于只读字段不能有 setter,因此不能有 setter。我使用 Add() 和 AddRange() 方法来填充集合。
    • 老实说...我没有看到只读的。为什么会在那里?这对我来说没有意义,它只会给你带来问题。如果要将 CsvExportList 隐藏到任何上层,请隐藏其设置器(使其受保护)。够了。您得到的错误与事实有关,即一旦会话关闭,您正在使用实体 ExportTask。您必须延长该会话的生命周期或急切地加载该集合...但我肯定会使用受保护的 setter...
    猜你喜欢
    • 2010-12-09
    • 1970-01-01
    • 2013-12-01
    • 2011-04-10
    • 2011-04-10
    • 1970-01-01
    • 2011-06-18
    • 2011-01-29
    • 2012-04-03
    相关资源
    最近更新 更多